gpt4 book ai didi

django admin "add page"来自 GET 参数的初始日期时间

转载 作者:行者123 更新时间:2023-12-04 15:22:33 25 4
gpt4 key购买 nike

我想创建一个链接,打开模型的 django 管理添加页面,其中预先填充了一些字段。

我检查了是否可以将参数添加到添加表单的 GET 字典中,如下所示:

<a href='/admin/myapp/mymodel/add?name=John'>add new mymodel with name John</a>

(实际上我使用 {% url 'admin:myapp_mymodel_add' %} 获取 url 但这只是明确的)。

现在这适用于数值、文本值和外键。但是 DateTime 字段呢?当我尝试传递这样的字段时(我尝试了许多格式,例如“2014-05-09 10:10:00”),我总是收到“服务器错误”提示:

'unicode' object has no attribute 'date'



在代码行中:

django/forms/widgets.py in decompress, line 902


 def decompress(self, value):
if value:
value = to_current_timezone(value)
return [value.date(), value.time().replace(microsecond=0)] ...
return [None, None]

其中变量“value”具有我在 URL 上传递的值...

问题 1. 我认为服务器代码不应该根据用户传递的值引发异常......这不是 django 库中的错误吗?

问题 2. 如何解决我的问题,即通过 GET 参数将初始日期时间传递到模型的管理“添加”页面?

最佳答案

不,这不是错误;可能有一个论点认为默认行为可以改进,但现有的实现是合理的第一遍(正如它适用于整数、字符串、外键等的事实所证明的那样)。有足够的关于模型的元数据和足够的反序列化代码,可以在这里做更好的处理,但我不认为这是一个直接的错误。

好消息是有一种官方的方法来处理这个问题。在您的 ModelAdmin类,定义:

def get_changeform_initial_data(self, request):

此方法接受请求,并将该请求转换为将作为 initial 传入的值。更改列表中表单的参数(即管理中的添加或编辑页面)。如您所料,此方法的默认实现是“获取 GET 参数并转换为字典”;如果你对你知道是日期时间的字段做一些额外的处理,那么

或者,您根本不必使用请求对象。如果您知道“Person”对象的初始名称始终为“Unknown”,初始开始日期为 2014 年 1 月 1 日,那么您只需编写:
class PersonAdmin(ModelAdmin):
...
def get_changeform_initial_data(self, request):
return {
'name': 'Unknown',
'start_date': date(2014, 1, 1)
}

即,不要关注请求数据,只需手动填充初始数据。由于它是表单的初始数据,对象上的任何现有数据都将覆盖 initial 中提供的值。 ,并且该初始数据将被使用而无需用户提供任何 GET他们的请求中的论据。

关于django admin "add page"来自 GET 参数的初始日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23559771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com