当然,我不是 django/python Jedi,但是......
我不认为你的做法有什么问题。这是一本干净的读物。
您可能不需要创建自己的小部件,只是为了在第一个表单显示上以正确的格式呈现日期。只需使用format
参数为DateInput
小部件,你应该没问题。所以在你的 MyDateField 类中我会这样做:
class MyDateField(forms.DateField):
widget = forms.DateInput(format="%d/%m/%Y")
def __init__(self, *args, **kwargs):
super(MyDateField, self).__init__(*args, **kwargs)
self.input_formats = ("%d/%m/%Y",)+(self.input_formats)
你可以使用formfield_callback
(参见接受的答案对于这个遥远相关的问题),意思是:
def customize_fields(f):
if isinstance(f, DateTimeField):
datetime_field=forms.DateTimeField(widget=
forms.DateInput(format='%d/%m/%Y %h:%i'))
date_field.input_formats = ("%d/%m/%Y %h:%i",)+
(date_field.input_formats)
return datetime_field
elif isinstance(f, DateField):
date_field=forms.DateField(widget=
forms.DateInput(format='%d/%m/%Y'))
date_field.input_formats = ("%d/%m/%Y",)+
(date_field.input_formats)
return date_field
else:
return f.formfield()
class MyModelForm(forms.ModelForm):
formfield_callback = customize_fields
class Meta:
model = ...
这样做完全消除了您的需要MyDateField
类,但可能会引入 - 如果您希望每个表单类都调用customize_fields
- 需要一个 ModelForm 后代,实现formfield_callback=customize_fields
作为所有表单类的新基础。
我的使用问题formfield_callback
机制有两个:
它的可读性较差,并且依赖于 ModelForms 内部工作原理的知识。我在任何地方都找不到有关 formfield_callback 的实际文档......
-
如果您需要在 ModelForm 中重新定义模型字段,例如使该字段对于表单的特定实例不需要,如下所示:
class MyModelForm(forms.ModelForm):
formfield_callback = customize_fields
foo = forms.DateField(required=false)
class Meta:
model = Bar
您正在覆盖customize_fields返回的表单字段,因此完全失去了自定义。
我认为你的方法更具可读性。