草庐IT

python - 在odoo开发中,我每次创建数据的时候,都会出现这样的xml编码错误

coder 2024-07-01 原文

我已经创建了model对象和对应的xml,但是在odoo首页点击Create按钮添加数据对象时,出现如下错误:

ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters

系统规范:

  • Ubuntu16.04。 2
  • Odoo 版本为 10.0
  • python解释器是2.7
  • lxml版本为3.5.0
  • pycharm版本为2018
  • Chrome 版本为 50.0.2661.102(64 位)

sudo locale时,出现这些
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN:en_US:en
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC=zh_CN.UTF-8
LC_TIME=zh_CN.UTF-8
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY=zh_CN.UTF-8
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER=zh_CN.UTF-8
LC_NAME=zh_CN.UTF-8
LC_ADDRESS=zh_CN.UTF-8
LC_TELEPHONE=zh_CN.UTF-8
LC_MEASUREMENT=zh_CN.UTF-8
LC_IDENTIFICATION=zh_CN.UTF-8
LC_ALL=

代码:

追随者.py

# -*- coding: utf-8 -*-
from odoo import models, api, fields
class follower(models.Model):
    _inherit = 'res.partner'
    bug_ids = fields.Many2many('bm.bug',string='bug')

错误.py

# -*- coding: utf-8 -*-
from odoo import models,api,fields
class bug(models.Model):
    _name = 'bm.bug'
    _description = 'bug'
    name = fields.Char(u'bug简述',required=True)
    detail = fields.Text(size=150)
    is_closed = fields.Boolean(u'是否关闭')
    close_reason = fields.Selection([('changed',u'已修改'),('cannot',u'无法修改'),('delay',u'推迟')],string='关闭理由')
    user_id = fields.Many2one('res.users',string=u'负责人')
    follower_id = fields.Many2many('res.partner',string=u'关注者')
    @api.multi
    def do_close(self):
        for item in self:
            item.is_closed = True
        return True

bug_adv.py

# -*- coding: utf-8 -*-
from odoo import api,fields,models
class bugAdvanced(models.Model):
    _inherit = 'bm.bug'
    need_time = fields.Integer(string='所需时间(小时)')
    name = fields.Char(help='简要描述发现的bug')
    stage_id = fields.Many2one('bm.bug.stage', string='阶段')
    tag_ids = fields.Many2many('bm.bug.tag',string='标示')

bug_stage.py

# -*- coding: utf-8 -*-
from odoo import models,fields,api
class bugStage(models.Model):
    _name = 'bm.bug.stage'
    _description = 'bug阶段'
    _order = 'sequence,name'
    name = fields.Char('名称')
    desc_detail = fields.Text('描述')
    status = fields.Selection([('waiting','未开始'),('doing','进行中'),('closed','关闭'),('rework','重测未通过')],'状态')
    document = fields.Html('文档')
    sequence = fields.Integer('Sequence')
    percent_pro = fields.Float('进度',(3,2))
    deadline = fields.Date('最晚解决日期')
    create_on = fields.Datetime('创建时间',default=lambda self:fields.Datetime.now())
    delay = fields.Boolean('是否延误')
    image = fields.Binary('图片')

错误标签.py

# -*- coding: utf-8 -*-
from odoo import fields,models,api
class bugTag(models.Model):
    _name = 'bm.bug.tag'
    _description = 'bug标示'
    name = fields.Char('名称')
    bug_ids = fields.Many2many('bm.bug',string='bug')

bugs.xml

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <data>
        <record model="ir.ui.view" id="bug-manage_list">
            <field name="name">bug列表</field>
            <field name="model">bm.bug</field>
            <field name="arch" type="xml">
                <tree>
                    <field name="name"/>
                    <field name="is_closed"/>
                    <field name="user_id"/>
                </tree>
            </field>
        </record>

        <record model="ir.ui.view" id="bug-manage_form">
            <field name="name">bug列表</field>
            <field name="model">bm.bug</field>
            <field name="arch" type="xml">
                <form>
                    <header>
                        <button name="do_close" type="object" string="关闭bug"/>
                    </header>
                    <sheet>
                        <group name="group_top" col="2">
                            <group name="goup_left">
                                <field name="name"/>
                                <field name="user_id"/>
                                <field name="is_closed"/>
                            </group>
                            <group name="group_right">
                                <field name="close_reason"/>
                                <field name="follower_id"/>
                            </group>
                        </group>
                        <notebook>
                            <page string="详细内容">
                                <field name="detail"/>
                            </page>
                        </notebook>
                    </sheet>
                </form>
            </field>
        </record>

        <record model="ir.ui.view" id="bug-manage_search">
            <field name="name">bug搜索</field>
            <field name="model">bm.bug</field>
            <field name="arch" type="xml">
                <search>
                    <field name="name"/>
                    <field name="is_closed"/>
                    <field name="user_id"/>
                </search>
            </field>
        </record>

        <record model="ir.actions.act_window" id="bug-manage_action_window">
            <field name="name">bug-manage window</field>
            <field name="res_model">bm.bug</field>
            <field name="view_mode">tree,form</field>
        </record>>

        <menuitem name="bug管理系统" id="menu_root"/>
        <menuitem name="bug管 理" id="menu_1" parent="bug-manage.menu_root"/>
        <menuitem name="bug列表" id="menu_1_list" parent="bug-manage.menu_1" action="bug-manage.bug-manage_action_window"/>
    </data>>
</odoo>

追随者.xml

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <data>
        <record model="ir.ui.view" id="bug-manage_follower_form">
            <field name="name">关注者</field>
            <field name="model">res.partner</field>
base.view_partner_form-->
            <field name="inherit_id" ref="base.view_partner_form"/>
            <field name="arch" type="xml">
                <field name="mobile" position="after">
                    <field name="bug_ids"/>
                </field>
            </field>
        </record>

        <record model="ir.actions.act_window" id="bug-manage_follower_action_window">
            <field name="name">follower window</field>
            <field name="res_model">res.partner</field>
            <field name="view_mode">form</field>
        </record>

        <menuitem name="关注者管理" id="menu_2" parent="bug-manage.menu_root"/>
        <menuitem name="关注者" id="menu_2_form" parent="bug-manage.menu_2" action="bug-manage.bug-manage_follower_action_window"/>
    </data>
</odoo>

bugs_adv.xml

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <data>
        <record model="ir.ui.view" id="bug-manage_form2">
            <field name="name">bug表单2</field>
            <field name="model">bm.bug</field>
            <field name="inherit_id" ref="bug-manage.bug-manage_form"/>
            <field name="arch" type="xml">
                <xpath expr="//field[@name='follower_id']" position="after">
                    <field name="stage_id"/>
                    <field name="tag_ids"/>
                </xpath>
            </field>
        </record>
    </data>
</odoo>

错误

Traceback (most recent call last):
  File "/home/python/Desktop/odoo10/server/odoo/http.py", line 638, in _handle_exception
    return super(JsonRequest, self)._handle_exception(exception)
  File "/home/python/Desktop/odoo10/server/odoo/http.py", line 675, in dispatch
    result = self._call_function(**self.params)
  File "/home/python/Desktop/odoo10/server/odoo/http.py", line 331, in _call_function
    return checked_call(self.db, *args, **kwargs)
  File "/home/python/Desktop/odoo10/server/odoo/service/model.py", line 119, in wrapper
    return f(dbname, *args, **kwargs)
  File "/home/python/Desktop/odoo10/server/odoo/http.py", line 324, in checked_call
    result = self.endpoint(*a, **kw)
  File "/home/python/Desktop/odoo10/server/odoo/http.py", line 933, in __call__
    return self.method(*args, **kw)
  File "/home/python/Desktop/odoo10/server/odoo/http.py", line 504, in response_wrap
    response = f(*args, **kw)
  File "/home/python/Desktop/odoo10/server/odoo/addons/web/controllers/main.py", line 872, in call_kw
    return self._call_kw(model, method, args, kwargs)
  File "/home/python/Desktop/odoo10/server/odoo/addons/web/controllers/main.py", line 864, in _call_kw
    return call_kw(request.env[model], method, args, kwargs)
  File "/home/python/Desktop/odoo10/server/odoo/api.py", line 685, in call_kw
    return call_kw_model(method, model, args, kwargs)
  File "/home/python/Desktop/odoo10/server/odoo/api.py", line 670, in call_kw_model
    result = method(recs, *args, **kwargs)
  File "/home/python/Desktop/odoo10/server/odoo/models.py", line 1328, in load_views
    for [v_id, v_type] in views
  File "/home/python/Desktop/odoo10/server/odoo/models.py", line 1328, in <dictcomp>
    for [v_id, v_type] in views
  File "/home/python/Desktop/odoo10/server/odoo/models.py", line 1399, in fields_view_get
    arch_etree = getattr(self, '_get_default_%s_view' % view_type)()
  File "/home/python/Desktop/odoo10/server/odoo/models.py", line 1230, in _get_default_tree_view
    return E.tree(element, string=self._description)
  File "/home/python/.virtualenvs/rhc_odoo_v10.0/local/lib/python2.7/site-packages/lxml/builder.py", line 218, in __call__
    get(dict)(elem, attrib)
  File "/home/python/.virtualenvs/rhc_odoo_v10.0/local/lib/python2.7/site-packages/lxml/builder.py", line 203, in add_dict
    attrib[k] = v
  File "src/lxml/lxml.etree.pyx", line 2402, in lxml.etree._Attrib.__setitem__ (src/lxml/lxml.etree.c:72066)
  File "src/lxml/apihelpers.pxi", line 570, in lxml.etree._setAttributeValue (src/lxml/lxml.etree.c:23009)
  File "src/lxml/apihelpers.pxi", line 1439, in lxml.etree._utf8 (src/lxml/lxml.etree.c:32441)
ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters

最佳答案

通过使用 u'your_label':

 help=u'简要描述发现的bug'

 _description = u'bug阶段'

string=u'所需时间(小时)'

fields.Selection([('waiting',u'未开始'),('doing',u'进行中')....

我也在用阿拉伯语编码,我总是使用 Unicode 作为我的标签以避免这个问题。

关于python - 在odoo开发中,我每次创建数据的时候,都会出现这样的xml编码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57780801/

有关python - 在odoo开发中,我每次创建数据的时候,都会出现这样的xml编码错误的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  5. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  6. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  7. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  8. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  9. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  10. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

随机推荐