如何在注册页面中添加文件附件字段?
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
模型,为attachment
和attachment_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>
我刚刚按照此
我现在可以完成我想要的大部分字段,因为其中大部分都是文本类型。
但是,我还需要一个必须接收文件附件的字段。 (用户可以在注册时上传文件附件,可以是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
模型,为attachment
和attachment_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>