一尘不染

如何更改ModelForm中所有Django日期字段的默认小部件?

django

给定一组典型模型:

# 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规范版本的内容。

的想法和意见表示赞赏。


阅读 638

收藏
2020-03-30

共1个答案

一尘不染

你可以在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(**kwargs)

class SomeForm(forms.ModelForm)
    formfield_callback = make_custom_datefield

    class Meta:
        # normal modelform stuff here...
2020-03-30