从 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的情况相同)
希望对你的情况有所帮助/
我有这个控制器:
@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的情况相同)
希望对你的情况有所帮助/