给定一组典型模型:
# 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,这是劳动密集型的,容易出现开发人员的错误(即几个models.DateField的通过),在我看来似乎不必要的重复努力。另一方面,我不喜欢修改可以被认为是规范版本的models.DateField。
赞赏的想法和输入。
解决方法
你可以在你的ModelForm类中声明一个属性,称为formfield_callback。这应该是一个函数,它使用一个Django模型Field实例作为参数,并返回一个表单Field实例来表示它的形式。
然后你需要做的是查看传递的模型字段是否是DateField的实例,如果是,返回您的自定义字段/小部件。如果没有,模型字段将有一个名为formfield的方法,您可以调用它返回其默认表单字段。
所以,像:
def make_custom_datefield(f): if isinstance(f,models.DateField): # return form field with your custom widget here... else: return f.formfield() class SomeForm(forms.ModelForm) formfield_callback = make_custom_datefield class Meta: # normal modelform stuff here...