4

这是关于如何更改 ModelForm 中所有 Django 日期字段的默认小部件的后续内容?.

假设您有大量模型(例如 A-ZZZ)随着其他开发人员的输入而增长,而您无法控制,并且您想要更改所有日期字段的输入方式(即通过使用 jQueryUI)。确保使用该新小部件填写所有日期字段的最佳方法是什么?

引用问题的一个建议是:

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...

但是,这是否可以在您没有明确的 ModelForm,但 url 模式直接来自模型的情况下进行?即你的 url 配置是这样的:

url(r'^A/?$', 'list_detail.object_list', SomeModelA)

其中 SomeModelA 是由 Django 在后台转换为 ModelForm 的模型(不是表单)。

目前在我的系统中,每个模型都没有表格。显式创建表单的唯一要点是添加先前解决方案中建议的 formfield_callback,但这违反了 DRY 原则,并且容易出错且劳动强度大。

我考虑过(如上一个线程中所建议的)创建我自己的具有特殊小部件的字段并使用它而不是内置的。它不是劳动密集型的,但它可能会出现错误(不过,没有什么是一个好的 grep 无法修复的)。

建议和想法表示赞赏。

4

1 回答 1

7

听起来您想在整个项目范围内执行此操作(即:您不是在某些情况下尝试执行此操作,而是在所有正在运行的应用程序中尝试执行此操作)。

一种可能性是替换 DateField 类本身的小部件属性。您需要在某个中心位置执行此操作......保证由 django 应用程序的每个运行实例加载的内容。中间件可以帮助解决这个问题。否则,只需将其放入__init__您的应用程序的文件中。

您要做的是为 forms.DateField 类本身重新分配小部件属性。创建新的 DateField 时,Django 会检查代码是否在字段属性定义中指定了任何特定的小部件。如果不是,它使用 DateField 的默认值。我假设如果您的场景中的用户确实定义了一个特定的小部件,那么尽管您的全局 API 发生了变化,您仍希望尊重这一点。

试试这个作为强制默认其他一些小部件的例子......在这种情况下是一个隐藏输入:

from django import forms
forms.DateField.widget = forms.HiddenInput

class Foo(forms.Form):
    a = forms.DateField()

f = Foo()
print f.fields['a'].widget
# results in <django.forms.widgets.HiddenInput object at 0x16bd910>
于 2009-03-20T00:31:47.187 回答