gpt4 book ai didi

python - 自定义 django 小部件 - decompress() arg 未填充

转载 作者:太空宇宙 更新时间:2023-11-03 15:29:41 25 4
gpt4 key购买 nike

作为练习,我正在尝试为 24 小时时钟创建一个自定义的 django 小部件。该小部件将是一个 MultiWidget - 每个字段都有一个选择框。

我正在尝试在线关注文档(有点稀疏)并查看 Pro Django 书籍,但我似乎无法弄清楚。我在正确的轨道上吗?我可以保存表单中的数据,但是当我预填充表单时,表单没有以前的值。

看来问题是 decompress() 方法的“值”参数始终为空,所以我没有什么可解释的。

from django.forms import widgets

import datetime

class MilitaryTimeWidget(widgets.MultiWidget):
"""
A widget that displays 24 hours time selection.
"""
def __init__(self, attrs=None):
hours = [ (i, "%02d" %(i)) for i in range(0, 24) ]
minutes = [ (i, "%02d" %(i)) for i in range(0, 60) ]
_widgets = (
widgets.Select(attrs=attrs, choices=hours),
widgets.Select(attrs=attrs, choices=minutes),
)
super(MilitaryTimeWidget, self).__init__(_widgets, attrs)

def decompress(self, value):
print "******** %s" %value
if value:
return [int(value.hour), int(value.minute)]
return [None, None]

def value_from_datadict(self, data, files, name):
hour = data.get("%s_0" %name, None)
minute = data.get("%s_1" %name, None)
if hour and minute:
hour = int(hour)
minute = int(minute)
return datetime.time(hour=hour, minute=minute)
return None

在我的表单中,我这样调用小部件:

arrival_time = forms.TimeField(label="Arrival Time", required=False, widget=MilitaryTimeWidget())

最佳答案

备注this line in the docstring for MultiWidget :

You'll probably want to use this class with MultiValueField.

这就是问题的根源。您也许能够使仅单一小部件的方法起作用(Marty 说这在 Pro Django 中是可能的,但我从未尝试过,而且我认为它可能会更有效),但是在那种情况下,您的小部件不应该是 MultiWidget 的子类。

您需要做的(如果您想遵循 MultiWidget/MultiValueField 路径)是:

  • 删除您的 value_from_datadict 方法
  • 定义一个子类MultiValueField使用 compress() 方法的定义,该方法执行您当前在 value_from_datadict() 中执行的任务(将数字列表转换为 datetime.time 对象)
  • 将您的小部件设置为自定义表单字段的默认小部件(使用小部件类属性)
  • 要么创建一个自定义模型字段,该字段从其 formfield() 方法返回您的自定义表单字段,要么手动使用您的自定义表单字段作为 ModelForm 中的字段覆盖。

然后一切都会正常工作。

关于python - 自定义 django 小部件 - decompress() arg 未填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/539899/

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