python - 从 Web Controller Odoo v8 更新模型

标签 python forms odoo qweb

我有这个 Controller :

@route('/contrato/crear/', type='http', auth='public',website=True)
def create(self, **post_data):
    form = CuidumForm(request.httprequest.form)
    form.partner_id.choices = [
        (partner.id, partner.name)
        for partner in request.env['res.partner'].search([])
    ]
    if request.httprequest.method == 'POST' and form.validate():
        request.env['account.periodical_invoicing.agreement'].create(dict([
            (field_name, field.data)
            for field_name, field in form._fields.iteritems()
        ]))
        return request.render(
            'website_create_partner.success',
            {'name': form.name.data})
    return request.render(
        'website_create_partner.contrato_new',
        {'form': form})

然后是来自 WTForms 的表单:

class CuidumForm(Form):
    name = StringField(_('Nombre periodical'),
        [Required(_('Please enter a name for the invoicing'))])
    nombre = StringField(_('Nombre'),
        [Required(_('Please enter a name for the Partner'))])
    n_seguridad_social = StringField(_('N de Seguridad Social'))#, [
    fecha_nacimiento = DateField(_('Fecha de nacimiento'), format='%d/%m/%Y', validators=(validators.Optional(),) )
    grado_discapacidad = StringField(_('Grado de discapacidad'))
    partner_id = SelectField(_('Country'), coerce=int)

这个逻辑实际上在 account.periodical_invoicing.agreement 上创建了一条新记录,我想从此模型更新记录而不是创建新记录,我该如何实现这一点?

我真的被这个问题困住了。

我需要从后端的表单 View 加载此 Web 表单,并将更新附加到此表单 View 。

例如,我使用按钮加载此表单,从后端的 x 表单 View 加载此 Web 表单,其中包含要更新的字段,然后保存并将其保存在我正在浏览的特定表单 View 上。

如果这听起来有点菜鸟,我很抱歉,但我是 Odoo v8 api 的新手,而且我对此感到非常困惑。

有什么想法吗?

非常感谢。

编辑

我这样做了,但它仍然创建了一个新记录:

@route('/contrato/editar/', type='http', auth='public',website=True)
def edit(self, **post_data):
    form = CuidumForm(request.httprequest.form)
    form.partner_id.choices = [
        (partner.id, partner.name)
        for partner in request.env['res.partner'].search([])
    ]
    if request.httprequest.method == 'GET' and form.validate():
        request.env['account.periodical_invoicing.agreement'].update(dict([
            (field_name, field.data)
            for field_name, field in form._fields.iteritems()
        ]))
        return request.render(
            'website_create_partner.success',
            {'name': form.name.data})
    return request.render(
        'website_create_partner.contrato_editar',
        {'form': form})

在我的 xml 中:

<template id="contrato_editar" name="Edicion">
<t t-call="website.layout">
    <div class="row">
        <div class="col-md-6 col-md-offset-2">
            <form role="form" action="/contrato/editar" method="GET">
                <t t-foreach="form" t-as="field">
                    <t t-call="website_create_partner.field_render_cuidum" />
                </t>
                <button type="submit" class="btn btn-primary mt8">Guardar</button>
            </form>
        </div>
    </div>
</t>
</template>

我还是很困惑,:(

最佳答案

创建一个新的网址处理程序/contrato/update/

 @route('/contrato/update/', type='http', auth='public',website=True)

这里,如果GET也会在隐藏字段中呈现模型的id

POST(更新)时,首先浏览记录,然后使用发布数据执行写入,如下所示:

  obj = request.env['account.periodical_invoicing.agreement'].browse( post.get(id))
  obj.write(post)

最终渲染更新后的数据(与GET的情况相同)

希望对您的情况有所帮助/

关于python - 从 Web Controller Odoo v8 更新模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37535903/

相关文章:

python - 实现中序遍历时出现NameError

ubuntu - odoo 14 上的未知路径 :/web/static/lib/moment/locale/en-us. js

python - 没有名为 libxml2 的模块 - Linux Mint Rafaela (Ubuntu 14.04)

python - 报告 qweb 未显示

html - 将 <select> <option> 的文本右对齐

Python 验证 Web 表单数据

python - Django:更改模型而不清除所有数据?

python - Sympy - 比较表达式

python - python 中的 "type"命令给出了意外结果

javascript - 在 Javascript 中创建表单-长度未定义