我有以下模型(简化):
class Location(models.Model):
name = models.CharField(max_length=100)
is_ok = models.BooleanField()
class Profile(models.Model):
name = models.CharField(max_length=100)
location = models.ForeignKey(Location)
class AnotherThing(models.Model):
name = models.CharField(max_length=100)
location = models.ForeignKey(Location)
我使用模型表单允许用户在数据库中添加/编辑Profile
和AnotherThing
项。
简化版:
class ProfileForm(ModelForm):
class Meta:
model = Profile
widgets = {'location': CustomLocationWidget()}
class AnotherThingForm(ModelForm):
class Meta:
model = Profile
widgets = {'location': CustomLocationWidget()}
CustomLocationWidget
的简化代码是这样的:
class CustomLocationWidget(Input):
def __init__(self, *args, **kwargs):
super(CustomLocationWidget, self).__init__(*args, **kwargs)
def render(self, name, value, attrs = None):
output = super(CustomLocationWidget).render(name, value, attrs)
output += 'Hello there!'
return mark_safe(output)
作为另一项验证,我需要在保存前检查Location
是否有is_ok == True
。我可以在ModelForm中轻松地为每个项目执行此操作,但代码在每种情况下都相同并且会中断DRY。如何在不为其编写代码的情况下将其添加到每个表单中?是否可以将验证器附加到窗口小部件?
我正在查看default_validators,但我不知道其他验证器用于ForeignKey
字段以及如何实际声明验证器。
答案 0 :(得分:6)
验证存在于字段上,而不是小部件上。如果您需要在一堆表单中进行相同的自定义验证,请定义自定义字段,向包含该验证代码的字段添加clean
方法,然后将字段的widget
属性定义为你的自定义小部件然后,您可以简单地以任何形式引用该字段。