2012-02-13 3 views
1

У меня есть следующие модели (упрощенный):Пользовательские проверки на пользовательском виджете

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 и как фактически объявить валидатор.

ответ

6

Валидация живет на полях, а не на виджетах. Если вам нужна такая же выборочная проверка в кучке форм, укажите настраиваемое поле, добавьте метод clean в это поле, содержащее этот код проверки, а затем укажите атрибут поля widget, который будет вашим пользовательским виджетами. Затем вы можете просто ссылаться на это поле в любой из ваших форм.

Смежные вопросы