【问题标题】:OpenERP 7 : How can I set a default date in a create form?OpenERP 7:如何在创建表单中设置默认日期?
【发布时间】:2015-07-10 13:26:52
【问题描述】:

我是 OpenERP 和 Python 的新手,我正在尝试在创建表单中设置默认日期,该日期必须是用户使用创建表单后的 28 天。

我尝试的最后一件事是:

from datetime import datetime
from datetime import date
from datetime import timedelta
from dateutil.relativedelta import relativedelta

from openerp.osv import fields, osv


class sale_order_dates(osv.osv):
    _inherit = 'sale.order'

    _columns = {
        'requested_date': fields.date('Requested Date', help="Date requested by the customer for the sale."),
    }

    _defaults = {
        'requested_date': date.today() + timedelta(days=28),
    }

sale_order_dates()

但是,如果我打开创建表单,我会收到此错误:

“服务器遇到内部错误,无法完成您的请求。服务器过载或应用程序出错。”

这可能是因为我无法在 _defaults 中进行操作,但我不知道该怎么做,我试图在函数中进行操作,但我对函数还不是很满意。 你对我该怎么做有什么想法吗? 提前致谢

编辑:这是计算机终端上的错误消息

2015-04-30 19:50:40,217 8666 ERROR Armand werkzeug: Error on request:
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 180, in run_wsgi
execute(self.server.app)
File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 168, in execute 
application_iter = app(environ, start_response)
File "/home/odoo/server/7.0/openerp/service/wsgi_server.py", line 417, in application
return application_unproxied(environ, start_response)
File "/home/odoo/server/7.0/openerp/service/wsgi_server.py", line 403, in application_unproxied
result = handler(environ, start_response)
File "/home/odoo/web/7.0/addons/web/http.py", line 528, in __call__
return self.dispatch(environ, start_response)
File "/home/odoo/web/7.0/addons/web/http.py", line 487, in __call__
return self.app(environ, start_wrapped)
File "/usr/local/lib/python2.7/dist-packages/werkzeug/wsgi.py", line 591, in __call__
return self.app(environ, start_response)
File "/home/odoo/web/7.0/addons/web/http.py", line 487, in __call__
return self.app(environ, start_wrapped)
File "/usr/local/lib/python2.7/dist-packages/werkzeug/wsgi.py", line 591, in __call__
return self.app(environ, start_response)
File "/home/odoo/web/7.0/addons/web/http.py", line 553, in dispatch
result = handler(request)
File "/home/odoo/web/7.0/addons/web/http.py", line 618, in <lambda>
return lambda request: JsonRequest(request).dispatch(method)
File "/home/odoo/web/7.0/addons/web/http.py", line 251, in dispatch
body = simplejson.dumps(response)
File "/usr/local/lib/python2.7/dist-packages/simplejson/__init__.py", line 370, in dumps
return _default_encoder.encode(obj)
File "/usr/local/lib/python2.7/dist-packages/simplejson/encoder.py", line 271, in encode
chunks = list(chunks)
File "/usr/local/lib/python2.7/dist-packages/simplejson/encoder.py", line 632, in _iterencode
for chunk in _iterencode_dict(o, _current_indent_level):
File "/usr/local/lib/python2.7/dist-packages/simplejson/encoder.py", line 591, in _iterencode_dict
for chunk in chunks:
File "/usr/local/lib/python2.7/dist-packages/simplejson/encoder.py", line 591, in _iterencode_dict
for chunk in chunks:
File "/usr/local/lib/python2.7/dist-packages/simplejson/encoder.py", line 642, in _iterencode
o = _default(o)
File "/usr/local/lib/python2.7/dist-packages/simplejson/encoder.py", line 246, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: datetime.date(2015, 5, 28) is not JSON serializable

所以看起来是_defaults中的操作不正确,可能这两个字段也不兼容,但我不知道我应该使用什么。

【问题讨论】:

  • 您能在日志中找到堆栈跟踪吗?如果不在生产环境中,也许打开调试模式?
  • 我不确定我是否理解,您是在谈论计算机终端告诉错误的内容吗?如果是这样,它是:“ raise TypeError(repr(o) + " is not JSON serializable") TypeError: datetime.date(2015, 5, 28) is not JSON serializable " 还有一些我不知道的文件的参考不知道,但是消息很长,我应该全部粘贴吗?在 OpenERP 调试模式下,我看不到我使用的字段,因为视图继承自多个 xml 文件。
  • 是的,这类信息很有帮助。您应该将其包含在您的问题中,以便正确格式化。

标签: python date openerp-7


【解决方案1】:

您的代码将在最新代码中正常工作。但是对于您的问题,您需要将日期作为字符串返回,而不是按 ORM 预期的格式返回日期对象。对您的代码进行以下更改。

from datetime import date
from datetime import timedelta
from dateutil.relativedelta import relativedelta

from openerp.osv import fields, osv
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT


class sale_order_dates(osv.osv):
    _inherit = 'sale.order'

    _columns = {
        'requested_date': fields.date('Requested Date', help="Date requested by the customer for the sale."),
    }

    _defaults = {
        'requested_date': (date.today() + timedelta(days=28)).strftime(DEFAULT_SERVER_DATE_FORMAT),
    }

sale_order_dates()

version 8 中,我们在字段定义本身中有一个静态方法来处理这个问题。我们只需要做的是

fields.Date.to_string(date_obj)

【讨论】:

  • 有效!非常感谢 !如果不是太多要求,我的任务还包括将请求的日期字段设置为星期一,如果它最初是在星期六或星期日设置的,所以我在 _defaults 中使用日期的“isoweekday”方法设置了条件,但似乎_defaults 不支持条件,我将使用我的代码将此部分添加到我的问题中。
  • 您需要在默认值中设置字典或者您可以在默认值中直接调用方法名称并让方法处理条件。您也可以直接使用 lambda 来计算结果。您可以在新问题中询问这些详细信息。谢谢。
  • 想知道的朋友,我问了第二个问题here
猜你喜欢
  • 2018-03-05
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多