将Django的默认小部件更改为自定义小部件

时间:2015-02-13 10:10:57

标签: django forms monkeypatching

我的用例:我想使用不同的DateInput。但我想减少代码重复。我希望所有不明确需要不同DateInput小部件的表单都能使用我的自定义小部件。

没有猴子修补就可以解决这个问题?

实施例

models.py:

class MyModel(models.Model):
    date=models.DateField()

forms.py:

class MyForm(forms.ModelForm):
    class Meta:
        model=MyModel

上面的代码应该使用我的自定义小部件。我不想更改上面的models.py和forms.py,因为有很多。

2 个答案:

答案 0 :(得分:1)

不幸的是,我认为您无法使用上面列出的确切代码。

没有黑客django,基本上有两个部分。第一个是创建自定义表单字段,第二个是将自定义模型字段默认为新创建的表单字段。

要创建自定义表单字段,您可以覆盖现有的django forms.DateField并更新小部件。

# form_fields.py
from django.forms import DateField
from myapp.widgets import MyWidget

class MyDateFormField(DateField):
    widget = MyWidget

然后在创建表单字段后,您将不得不覆盖django模型字段以默认为新的表单字段

# fields.py
from django.db.models import DateField
from myapp.form_fields import MyDateFormField

class MyDateField(MyDateFormField):
    def formfield(self, **kwargs):
        defaults = {'form_class': MyDateFormField}
        defaults.update(kwargs)
        return super(DateField, self).formfield(**defaults)

然后您将拥有自定义模型字段,您需要稍微更改要使用的代码。

from myapp.fields import MyDateField

class MyModel(models.Model):
    date=MyDateField()

这不完全是你要求的(必须更改模型字段),但希望这能让你朝着正确的方向前进。

答案 1 :(得分:0)

  1. 创建您的字段
  2. 创建默认情况下将使用此字段的表单
  3. 使用时导入此表单而不是默认表单
  4. 如果您在管理员中使用它:

    1. 创建您自己的ModelAdmin,默认情况下将使用您的表单
    2. 使用它而不是默认的ModelAdmin。