Odoo 10.0 无效约束
Odoo 10.0 invalid constraint
我在 odoo.com here 上问过这个问题。
我正在尝试用我自己的字段替换 product.template 视图中的字段。
在 gui 中,单击 Sales/Sales/Products、select 产品,单击发票选项卡 - 我想将 "Add Task to Project" 选项更改为 "Generate project from Template"。这是最终目标 - 但首先我需要至少能够向模板视图添加一个字段,但我在这方面失败了!
按照 https://www.amazon.co.uk/Odoo-Development-Essentials-Daniel-Reis-ebook/dp/B01KI1F302/ref=sr_1_1?ie=UTF8&qid=1507024599&sr=8-1&keywords=odoo+10+development+essentials 书中的建议,我在 views/views.xml -
中创建了以下 xml
<odoo>
<data>
<record model="ir.ui.view" id="view_product_template_form_inherited">
<field name="name">MSUK view product template form</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_only_form_view" />
<field name="arch" type="xml">
<xpath name="//field[@name='project_id']" position="before">
<field name="project_templates" />
</xpath>
</field>
</record>
</data>
</odoo>
并在 models.py 中:
from odoo import models, fields, api
from pprint import pprint
import logging
class msuk_sales(models.Model):
_inherit = 'product.template'
logger = logging.getLogger()
project_templates = fields.Char('Templates', required=True) #String("template projects") #Many2one('project_project')
# for record in project_templates:
# logger.log(20, record)
当我点击 "Apps" 时我的模块可用,所以我不会费心给你看 manifest.py
当我点击 "Upgrade" 时,我得到以下堆栈跟踪:
2017-10-03 10:24:26,654 18191 INFO miningsearchesuk odoo.modules.loading: loading msuk_sales/views/views.xml
2017-10-03 10:24:26,710 18191 ERROR miningsearchesuk odoo.modules.registry: Failed to load registry
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 640, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 677, in dispatch
result = self._call_function(**self.params)
File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 333, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/odoo/service/model.py", line 101, in wrapper
return f(dbname, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 326, in checked_call
result = self.endpoint(*a, **kw)
File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 935, in __call__
return self.method(*args, **kw)
File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 506, in response_wrap
response = f(*args, **kw)
File "/usr/lib/python2.7/dist-packages/odoo/addons/web/controllers/main.py", line 889, in call_button
action = self._call_kw(model, method, args, {})
File "/usr/lib/python2.7/dist-packages/odoo/addons/web/controllers/main.py", line 877, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/usr/lib/python2.7/dist-packages/odoo/api.py", line 681, in call_kw
return call_kw_multi(method, model, args, kwargs)
File "/usr/lib/python2.7/dist-packages/odoo/api.py", line 672, in call_kw_multi
result = method(recs, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/odoo/addons/base/module/module.py", line 527, in button_immediate_upgrade
return self._button_immediate_function(type(self).button_upgrade)
File "/usr/lib/python2.7/dist-packages/odoo/addons/base/module/module.py", line 484, in _button_immediate_function
modules.registry.Registry.new(self._cr.dbname, update_module=True)
File "/usr/lib/python2.7/dist-packages/odoo/modules/registry.py", line 82, in new
odoo.modules.load_modules(registry._db, force_demo, status, update_module)
File "/usr/lib/python2.7/dist-packages/odoo/modules/loading.py", line 335, in load_modules
force, status, report, loaded_modules, update_module)
File "/usr/lib/python2.7/dist-packages/odoo/modules/loading.py", line 237, in load_marked_modules
loaded, processed = load_module_graph(cr, graph, progressdict, report=report, skip_modules=loaded_modules, perform_checks=perform_checks)
File "/usr/lib/python2.7/dist-packages/odoo/modules/loading.py", line 156, in load_module_graph
_load_data(cr, module_name, idref, mode, kind='data')
File "/usr/lib/python2.7/dist-packages/odoo/modules/loading.py", line 95, in _load_data
tools.convert_file(cr, module_name, filename, idref, mode, noupdate, kind, report)
File "/usr/lib/python2.7/dist-packages/odoo/tools/convert.py", line 845, in convert_file
convert_xml_import(cr, module, fp, idref, mode, noupdate, report)
File "/usr/lib/python2.7/dist-packages/odoo/tools/convert.py", line 915, in convert_xml_import
obj.parse(doc.getroot(), mode=mode)
File "/usr/lib/python2.7/dist-packages/odoo/tools/convert.py", line 796, in parse
self.parse(rec, mode)
File "/usr/lib/python2.7/dist-packages/odoo/tools/convert.py", line 799, in parse
self._tags[rec.tag](rec, de, mode=mode)
File "/usr/lib/python2.7/dist-packages/odoo/tools/convert.py", line 707, in _tag_record
id = self.env(context=rec_context)['ir.model.data']._update(rec_model, self.module, res, rec_id or False, not self.isnoupdate(data_node), noupdate=self.isnoupdate(data_node), mode=self.mode)
File "/usr/lib/python2.7/dist-packages/odoo/addons/base/ir/ir_model.py", line 1228, in _update
record = record.create(values)
File "/usr/lib/python2.7/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 363, in create
return super(View, self).create(self._compute_defaults(values))
File "/usr/lib/python2.7/dist-packages/odoo/models.py", line 3839, in create
self._fields[key].determine_inverse(record)
File "/usr/lib/python2.7/dist-packages/odoo/fields.py", line 1000, in determine_inverse
getattr(records, self.inverse)()
File "/usr/lib/python2.7/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 220, in _inverse_arch
view.write(data)
File "/usr/lib/python2.7/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 381, in write
return super(View, self).write(self._compute_defaults(vals))
File "/usr/lib/python2.7/dist-packages/odoo/models.py", line 3564, in write
self._write(old_vals)
File "/usr/lib/python2.7/dist-packages/odoo/models.py", line 3716, in _write
self._validate_fields(vals)
File "/usr/lib/python2.7/dist-packages/odoo/models.py", line 1083, in _validate_fields
raise ValidationError("%s\n\n%s" % (_("Error while validating constraint"), tools.ustr(e)))
ParseError: "Error while validating constraint
Argument must be bytes or unicode, got 'NoneType'
None" while parsing /home/dominic.pain/miningsearchesuk/src/python/msuk_sales/views/views.xml:3, near
<record model="ir.ui.view" id="view_product_template_form_inherited">
<field name="name">MSUK view product template form</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_only_form_view"/>
<field name="arch" type="xml">
<xpath name="//field[@name='project_id']" position="before">
<field name="project_templates"/>
</xpath>
</field>
</record>
你写错了xpath
应该是
<xpath expr="//field[@name='project_id']" position="before">
<field name="project_templates"/>
</xpath>
我在 odoo.com here 上问过这个问题。
我正在尝试用我自己的字段替换 product.template 视图中的字段。
在 gui 中,单击 Sales/Sales/Products、select 产品,单击发票选项卡 - 我想将 "Add Task to Project" 选项更改为 "Generate project from Template"。这是最终目标 - 但首先我需要至少能够向模板视图添加一个字段,但我在这方面失败了!
按照 https://www.amazon.co.uk/Odoo-Development-Essentials-Daniel-Reis-ebook/dp/B01KI1F302/ref=sr_1_1?ie=UTF8&qid=1507024599&sr=8-1&keywords=odoo+10+development+essentials 书中的建议,我在 views/views.xml -
中创建了以下 xml<odoo>
<data>
<record model="ir.ui.view" id="view_product_template_form_inherited">
<field name="name">MSUK view product template form</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_only_form_view" />
<field name="arch" type="xml">
<xpath name="//field[@name='project_id']" position="before">
<field name="project_templates" />
</xpath>
</field>
</record>
</data>
</odoo>
并在 models.py 中:
from odoo import models, fields, api
from pprint import pprint
import logging
class msuk_sales(models.Model):
_inherit = 'product.template'
logger = logging.getLogger()
project_templates = fields.Char('Templates', required=True) #String("template projects") #Many2one('project_project')
# for record in project_templates:
# logger.log(20, record)
当我点击 "Apps" 时我的模块可用,所以我不会费心给你看 manifest.py
当我点击 "Upgrade" 时,我得到以下堆栈跟踪:
2017-10-03 10:24:26,654 18191 INFO miningsearchesuk odoo.modules.loading: loading msuk_sales/views/views.xml
2017-10-03 10:24:26,710 18191 ERROR miningsearchesuk odoo.modules.registry: Failed to load registry
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 640, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 677, in dispatch
result = self._call_function(**self.params)
File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 333, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/odoo/service/model.py", line 101, in wrapper
return f(dbname, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 326, in checked_call
result = self.endpoint(*a, **kw)
File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 935, in __call__
return self.method(*args, **kw)
File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 506, in response_wrap
response = f(*args, **kw)
File "/usr/lib/python2.7/dist-packages/odoo/addons/web/controllers/main.py", line 889, in call_button
action = self._call_kw(model, method, args, {})
File "/usr/lib/python2.7/dist-packages/odoo/addons/web/controllers/main.py", line 877, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/usr/lib/python2.7/dist-packages/odoo/api.py", line 681, in call_kw
return call_kw_multi(method, model, args, kwargs)
File "/usr/lib/python2.7/dist-packages/odoo/api.py", line 672, in call_kw_multi
result = method(recs, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/odoo/addons/base/module/module.py", line 527, in button_immediate_upgrade
return self._button_immediate_function(type(self).button_upgrade)
File "/usr/lib/python2.7/dist-packages/odoo/addons/base/module/module.py", line 484, in _button_immediate_function
modules.registry.Registry.new(self._cr.dbname, update_module=True)
File "/usr/lib/python2.7/dist-packages/odoo/modules/registry.py", line 82, in new
odoo.modules.load_modules(registry._db, force_demo, status, update_module)
File "/usr/lib/python2.7/dist-packages/odoo/modules/loading.py", line 335, in load_modules
force, status, report, loaded_modules, update_module)
File "/usr/lib/python2.7/dist-packages/odoo/modules/loading.py", line 237, in load_marked_modules
loaded, processed = load_module_graph(cr, graph, progressdict, report=report, skip_modules=loaded_modules, perform_checks=perform_checks)
File "/usr/lib/python2.7/dist-packages/odoo/modules/loading.py", line 156, in load_module_graph
_load_data(cr, module_name, idref, mode, kind='data')
File "/usr/lib/python2.7/dist-packages/odoo/modules/loading.py", line 95, in _load_data
tools.convert_file(cr, module_name, filename, idref, mode, noupdate, kind, report)
File "/usr/lib/python2.7/dist-packages/odoo/tools/convert.py", line 845, in convert_file
convert_xml_import(cr, module, fp, idref, mode, noupdate, report)
File "/usr/lib/python2.7/dist-packages/odoo/tools/convert.py", line 915, in convert_xml_import
obj.parse(doc.getroot(), mode=mode)
File "/usr/lib/python2.7/dist-packages/odoo/tools/convert.py", line 796, in parse
self.parse(rec, mode)
File "/usr/lib/python2.7/dist-packages/odoo/tools/convert.py", line 799, in parse
self._tags[rec.tag](rec, de, mode=mode)
File "/usr/lib/python2.7/dist-packages/odoo/tools/convert.py", line 707, in _tag_record
id = self.env(context=rec_context)['ir.model.data']._update(rec_model, self.module, res, rec_id or False, not self.isnoupdate(data_node), noupdate=self.isnoupdate(data_node), mode=self.mode)
File "/usr/lib/python2.7/dist-packages/odoo/addons/base/ir/ir_model.py", line 1228, in _update
record = record.create(values)
File "/usr/lib/python2.7/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 363, in create
return super(View, self).create(self._compute_defaults(values))
File "/usr/lib/python2.7/dist-packages/odoo/models.py", line 3839, in create
self._fields[key].determine_inverse(record)
File "/usr/lib/python2.7/dist-packages/odoo/fields.py", line 1000, in determine_inverse
getattr(records, self.inverse)()
File "/usr/lib/python2.7/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 220, in _inverse_arch
view.write(data)
File "/usr/lib/python2.7/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 381, in write
return super(View, self).write(self._compute_defaults(vals))
File "/usr/lib/python2.7/dist-packages/odoo/models.py", line 3564, in write
self._write(old_vals)
File "/usr/lib/python2.7/dist-packages/odoo/models.py", line 3716, in _write
self._validate_fields(vals)
File "/usr/lib/python2.7/dist-packages/odoo/models.py", line 1083, in _validate_fields
raise ValidationError("%s\n\n%s" % (_("Error while validating constraint"), tools.ustr(e)))
ParseError: "Error while validating constraint
Argument must be bytes or unicode, got 'NoneType'
None" while parsing /home/dominic.pain/miningsearchesuk/src/python/msuk_sales/views/views.xml:3, near
<record model="ir.ui.view" id="view_product_template_form_inherited">
<field name="name">MSUK view product template form</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_only_form_view"/>
<field name="arch" type="xml">
<xpath name="//field[@name='project_id']" position="before">
<field name="project_templates"/>
</xpath>
</field>
</record>
你写错了xpath 应该是
<xpath expr="//field[@name='project_id']" position="before">
<field name="project_templates"/>
</xpath>