如何在注册页面中添加文件附件字段?

How to add a field for File Attachment in Sign-up page?

我刚刚按照此 在网站注册页面中进行了自定义。

我现在可以完成我想要的大部分字段,因为其中大部分都是文本类型。

但是,我还需要一个必须接收文件附件的字段。 (用户可以在注册时上传文件附件,可以是documents/pdfs/images。

问题是如何完成这样的任务?我知道我需要在数据库及其相关模型(如 res.partner 中的某处为它设置一个字段,但我不知道如何嵌入一个字段来上传文件附件并将其发送到服务器并将其存储在完全数据库。

您想通过 POST 发送文件,因此您需要先将 enctype 表单属性设置为 multipart/form-data

示例:

<template id="signup" inherit_id="auth_signup.signup" name="Sign up login">
    <xpath expr="//form" position="attributes">
        <attribute name="enctype">multipart/form-data</attribute>
    </xpath>
</template>

更改 auth_signup.fields 模板并添加 file

类型的输入

示例:

<template id="signup_fields" inherit_id="auth_signup.fields" name="Auth Signup attachment form field">
    <xpath expr="//div[last()]" position="after">
        <div class="form-group field-login">
            <label for="attachment">Attachment</label>
            <input type="file" name="attachment" id="attachment" class="form-control form-control-sm"/>
        </div>
    </xpath>
</template>

然后覆盖 _signup_with_values 方法以在保存到数据库之前准备字段值。

示例:

import base64

class AuthSignupStreet(AuthSignupHome):
    def _signup_with_values(self, token, values):
        context = self.get_auth_signup_qcontext()
        attachment = context.get('attachment')
        if attachment:
            datas = base64.b64encode(attachment.read())
            values.update({'attachment': datas, 'attachment_name': attachment.filename})
        super(AuthSignupStreet, self)._signup_with_values(token, values)

之后,继承res.partner模型,为attachmentattachment_name增加2个字段。

示例:

class ResPartnerInherit(models.Model):
    _inherit = 'res.partner'

    attachment = fields.Binary(string="Attachment", attachment=True)
    attachment_name = fields.Char(string='Attachment Name')

最后,(可选)继承 Contact 中的表单,以便它显示(并允许编辑)附件。

示例:

<record id="res_partner_form_attachment" model="ir.ui.view">
    <field name="name">res.partner.form.attachment</field>
    <field name="model">res.partner</field>
    <field name="inherit_id" ref="base.view_partner_form"/>
    <field name="arch" type="xml">
        <xpath expr="//form/sheet/notebook" position="inside">
            <page string="Attachment">
                <field name="attachment" filename="attachment_name"/>
                <field name="attachment_name" invisible="1"/>
            </page>
        </xpath>
    </field>
</record>