将 Django 的默认小部件更改为自定义小部件
Change default widgets of Django to custom ones
我的用例:我想使用不同的 DateInput。但我想减少代码重复。我希望所有不明确需要不同 DateInput 小部件的表单都使用我的自定义小部件。
在不使用 monkey patching 的情况下有什么改变可以解决这个问题吗?
例子
models.py:
class MyModel(models.Model):
date=models.DateField()
forms.py:
class MyForm(forms.ModelForm):
class Meta:
model=MyModel
以上代码应该使用我的自定义小部件。上面的models.py和forms.py不想改,因为有很多
- 创建你的领域
- 创建默认使用该字段的表单
- 在使用时导入此表单而不是默认表单
如果您在管理员中使用它:
- 创建您自己的 ModelAdmin,默认使用您的表单
- 使用它代替默认的 ModelAdmin。
不幸的是,我认为您无法使用上面列出的确切代码来实现此功能。
如果不破解 Django,基本上有 2 个部分。第一个是创建自定义 表单域 ,第二个是将自定义 模型域 默认为新创建的表单域。
要创建您的自定义表单字段,您可以覆盖现有的 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()
这并不完全符合您的要求(必须更改模型字段),但希望这能让您朝着正确的方向前进。
我的用例:我想使用不同的 DateInput。但我想减少代码重复。我希望所有不明确需要不同 DateInput 小部件的表单都使用我的自定义小部件。
在不使用 monkey patching 的情况下有什么改变可以解决这个问题吗?
例子
models.py:
class MyModel(models.Model):
date=models.DateField()
forms.py:
class MyForm(forms.ModelForm):
class Meta:
model=MyModel
以上代码应该使用我的自定义小部件。上面的models.py和forms.py不想改,因为有很多
- 创建你的领域
- 创建默认使用该字段的表单
- 在使用时导入此表单而不是默认表单
如果您在管理员中使用它:
- 创建您自己的 ModelAdmin,默认使用您的表单
- 使用它代替默认的 ModelAdmin。
不幸的是,我认为您无法使用上面列出的确切代码来实现此功能。
如果不破解 Django,基本上有 2 个部分。第一个是创建自定义 表单域 ,第二个是将自定义 模型域 默认为新创建的表单域。
要创建您的自定义表单字段,您可以覆盖现有的 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()
这并不完全符合您的要求(必须更改模型字段),但希望这能让您朝着正确的方向前进。