从 Web 控制器 Odoo v8 更新模型

Update model from web controller Odoo v8

我有这个控制器:

@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 上创建了一条新记录,我想从这个模型更新记录而不是创建新记录,我该如何实现?

我真的卡在这个上面了。

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

例如,我用一个按钮加载它,从后端的 x 表单视图加载这个带有要更新的字段的 Web 表单,然后保存并将它保存在我正在浏览的特定表单视图中。

如果这听起来很菜鸟,我很抱歉,但我是 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>

我还是一头雾水,:(

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

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

此处在 GET 的情况下还会在隐藏字段中呈现模型的 id

并且在POST(update)时先浏览记录然后执行用 post 数据写入 ,如下所示:

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

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

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