Загрузить файл в форме регистрации Odoo 12 - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь добавить поле «вложение» в форму регистрации Odoo 12. Я делюсь с вами своей работой, если вы можете исправить меня, пожалуйста:

В моем file_one. xml:

<template id="auth_signup_fields_extend" inherit_id="auth_signup.fields" name="Signup Fields Extend">
<xpath expr="//div[hasclass('field-confirm_password')]" position="after">
<div class="form-group field-attachment">
<label for="attachment" class="control-label">Attachment</label>
<input type="file" name="attachment"  multiple="true" data-show-upload="true" data-show- 
caption="true" id="project.id" data-show-preview="true" class="form-control" required="required" t- 
att-readonly="'readonly' if only_passwords else None" t-att-autofocus="'autofocus' if login and not 
only_passwords else None"/>
</div>
</xpath>
</template>

В моем файле_2. xml:

<data>
<record id="res_partner_form_inherit" model="ir.ui.view">
<field name="name">res.partner.form.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='function']" position="after">
<field name="attachment"/>
</xpath>
</field>
</record>
</data>

В моем файле model.py

# -*- coding: utf-8 -*-

from odoo import fields, models

class ResPartner(models.Model):
    _inherit = "res.partner"
    attachment = fields.Binary(string='File of User',attachment=True)

В моем файле controller.py:

@http.route('/web/signup', type='http', auth='public', website=True, 
sitemap=False)
def web_auth_signup(self,**post):
    qcontext = self.get_auth_signup_qcontext()
    values = {}
    if post.get('attachment',False):
        Attachments = request.env['ir.attachment']
        name = post.get('attachment').filename      
        file = post.get('attachment')
        project_id = post.get('project_id')
        attachment = file.read() 
        attachment_id = Attachments.sudo().create({
            'name':name,
            'datas_fname': name,
            'res_name': name,
            'type': 'binary',   
            'res_model': 'model.model',
            'datas': attachment.encode('base64'),
        })
        value = {
            'attachment' : attachment_id
        }
        return request.render("fl_auth_signup.users", value)

Я видел много уроков и вопросов / ответов по этому поводу, но мой модуль не работает, на данный момент у меня есть ошибка: локальная переменная 'Attachments' ссылается до назначения

Пожалуйста, помогите, вы можете исправить меня? ...

1 Ответ

1 голос
/ 30 апреля 2020

Вы получите следующую ошибку:

local variable 'attachment_id' referenced before assignment , line 52, in web_auth_signup

Эта ошибка произойдет, потому что следующий код должен быть внутри оператора if:

value = {'attachment': attachment_id}

return request.render("fl_auth_signup.users", value)  

Вы также использовали *args и **kw (в строке 75), но они не объявлены:

return super(AuthSignupHome, self).web_login(*args, **kw)

Я проверил исходный код в auth_signup и обнаружил, что вы изменили подпись метода web_auth_signup. Я предлагаю вам оставить подпись такой, какая она есть, и использовать kw вместо post.

@http.route('/web/signup', type='http', auth='public', website=True,
            sitemap=False)
def web_auth_signup(self, *args, **kw):
    qcontext = self.get_auth_signup_qcontext()
    # values = {}
    if kw.get('attachment', False):
        attachments = request.env['ir.attachment']
        name = kw.get('attachment').filename
        file = kw.get('attachment')
        # project_id = kw.get('project_id')
        attachment = file.read()
        attachment_id = attachments.sudo().create({
            'name': name,
            'datas_fname': name,
            'res_name': name,
            'type': 'binary',
            'res_model': 'model.model',
            'datas': base64.b64encode(attachment),
        })
        value = {
            'attachment': attachment_id
        }
        return request.render("fl_auth_signup.users", value)

        # The rest of your code with no changes

Обновите тег form и установите для enctype значение multipart/form-data, это требуется при использовании форм с элементом управления загрузкой файлов.

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