У меня есть следующие модели (упрощенный):Пользовательские проверки на пользовательском виджете
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)
Я использую ModelForm, чтобы позволить пользователям добавлять/редактировать 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
и как фактически объявить валидатор.