给定一组典型模型:
# Application A from django.db import models class TypicalModelA(models.Model): the_date = models.DateField() # Application B from django.db import models class TypicalModelB(models.Model): another_date = models.DateField() ...
如何将所有 DateField 的默认窗口小部件更改为自定义MyDateWidget?
我问是因为我希望我的应用程序具有用于输入日期的jQueryUI datepicker。
我考虑过使用自定义窗口小部件扩展django.db.models.DateField的自定义字段。这是实施这种全面变更的最佳方法吗?这样的更改将需要将特殊的MyDateField专门导入每个模型中,这是劳动密集型的,容易发生开发人员错误(例如,一些模型。DateField会通过),在我看来,这似乎是不必要的重复劳动。另一方面,我不喜欢修改可以认为是Model.DateField规范版本的内容。
的想法和意见表示赞赏。
你可以在ModelForm类中声明一个名为的属性formfield_callback。这应该是一个函数,它以Django模型Field实例为参数,并返回一个表单Field实例以在表单中表示它。
ModelForm
formfield_callback
Field
然后,你要做的就是查看传入的模型字段是否是的实例DateField,如果是,则返回你的自定义字段/小部件。否则,模型字段将具有一个名为的方法formfield,你可以调用该方法以返回其默认表单字段。
DateField
formfield
因此,类似:
def make_custom_datefield(f): if isinstance(f, models.DateField): # return form field with your custom widget here... else: return f.formfield(**kwargs) class SomeForm(forms.ModelForm) formfield_callback = make_custom_datefield class Meta: # normal modelform stuff here...