【问题标题】:attachments are not being saved on backend from website odoo 12附件未从网站 odoo 12 保存在后端
【发布时间】:2020-08-20 15:32:48
【问题描述】:

我想在网站上编辑名为我的信息的表单时添加附件,并且我想将附件保存在后端。我在附件表单中添加了输入字段,但是在保存表单时,我没有在后端获取附件。 这是我的代码:-

模板文件:-

<div class="form-group row">
     <div class="col-lg-3 col-md-4">
      <label class="control-label" for="Attachments">
       Attach Files
      </label>
     </div>
     <div class="col-lg-7 col-md-12">
       <input id='attachment' type="file"
       class="form-control o_website_form_input"
       name="attachment" multiple="true"
       data-show-preview="true"                                                                          
       accept="application/pdf"/>
      </div>
</div>

控制器文件:-

@route(['/path/to/template'], type='http', auth='public', website=True)
def account(self, redirect=None, **post):
    values = self._prepare_portal_layout_values()
    User = request.env.user
    partner = User.partner_id
    
    if post:

        print("post::::::::::::::::::::::", post, values)
        attachment_ids = []
        attachment_list = request.httprequest.files.getlist('attachment')
        print("attachment_list::::::::::::::::", attachment_list)
        for att in attachment_list:
            if post.get('attachment'):
                attachments = {
                    'res_name': att.filename,
                    'res_model': 'res.partner',
                    'res_id': partner.sudo().id,
                    'datas': base64.encodestring(att.read()),
                    'type': 'binary',
                    'datas_fname': att.filename,
                    'name': att.filename,
                }
                attachment_obj = http.request.env['ir.attachment']
                att_record = attachment_obj.sudo().create(attachments)
                attachment_ids.append(att_record.id)
        if attachment_ids:
            values.update({'attachment_ids': [(6, 0, attachment_ids)]})

那么谁能告诉我我缺少什么?

【问题讨论】:

  • 您确定该字段在&lt;form&gt; 标签内吗?

标签: templates controller odoo odoo-12


【解决方案1】:

enctype 属性指定用于向服务器提交表单的内容类型(当方法的值为post 时)。该属性的默认值为application/x-www-form-urlencoded

multipart/form-data 应与INPUT 元素type="file" 结合使用。

您需要将enctype 设置为multipart/form-data 才能使用input 类型的file

您可以在web_editor 模块中找到一个示例:

<form class="form-inline"
            method="POST"
            action="/web_editor/attachment/add"
            enctype="multipart/form-data"

类型文件的输入定义如下:

<input type="file" class="d-none" name="upload" t-att-accept="widget.accept" multiple="multiple"/>

文件从request object 恢复(就像你做的那样):

request.httprequest.files.getlist('upload')

编辑:

编码类型

application/x-www-form-urlencoded 内容类型对于发送大量二进制数据或包含非 ASCII 字符的文本效率低下。内容类型multipart/form-data 应该用于提交包含文件、非ASCII 数据和二进制数据的forms

multiple = boolean

指示是否允许用户指定多个值。

在 HTML 中,您可以简单地使用最小化形式 multiple,但在 Odoo 模板中,Odoo 会引发 XMLSyntaxError

XMLSyntaxError: Specification mandates value for attribute multiple  

Boolean attributes 可以合法地采用单个值:属性本身的名称(例如,multiple="multiple")。

它们出现在元素的开始标记中意味着该属性的值为true。他们的缺席意味着false的值

multiple 属性的值设置为multiple 或``true` 将得到相同的结果。

【讨论】:

  • 谢谢@kenly。我没有使用 enctype="multipart/form-data" 并将其添加到我的表单中,并将 multiple="multiple" 从 multiple="true" 更改,然后它工作了。非常感谢。但我想问一下为什么我们需要 enctype="multipart/form-data" 形式以及 multiple="multiple" 和 multiple="true" 之间的区别是什么?请您提供一些想法吗?
  • 我添加了一些解释为什么我们需要使用enctype="multipart/form-data"以及如何使用布尔属性multiple,您可以参考文档链接了解更多详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 2015-11-09
  • 2012-03-05
相关资源
最近更新 更多