Проверка формы Django: сделать «обязательным» условие? - PullRequest
12 голосов
/ 21 февраля 2010

Я новичок в Django (и Python) и пытаюсь выяснить, как обусловить определенные аспекты проверки формы. В этом случае есть HTML-интерфейс приложения, где пользователь может выбрать дату и время из виджетов. Метод clean в объекте формы принимает значения полей времени и даты и превращает их обратно в datetime.

В дополнение к интерфейсу HTML в приложение также входит клиент для iPhone, и я хотел бы передать значение времени в стиле отметки времени UNIX.

Мой код формы выглядит так:

class FooForm(forms.ModelForm):
    foo_date             = forms.CharField(required=True, widget=forms.RadioSelect(choices=DATE_CHOICES))
    foo_time             = forms.CharField(required=True, widget=SelectTimeWidget())
    foo_timestamp        = forms.CharField(required=False)

Как мне сделать foo_date и foo_time обязательными , если не указано foo_timestamp?

Ответы [ 2 ]

22 голосов
/ 21 февраля 2010

Это делается с помощью метода clean в форме. Однако вам необходимо установить foo_date и foo_time на required=False, поскольку clean вызывается только после проверки каждого поля (см. Также документацию ).

class FooForm(forms.Form)
    # your field definitions

    def clean(self):
        data = self.cleaned_data
        if data.get('foo_timestamp', None) or (data.get('foo_date', None) and data.get('foo_time', None)):
            return data
        else:
            raise forms.ValidationError('Provide either a date and time or a timestamp')
8 голосов
/ 17 февраля 2013

Мне понадобился «стандартный» способ сделать это, так как в моих формах есть несколько условно обязательных полей. Поэтому я создал суперкласс с помощью следующего метода:

def validate_required_field(self, cleaned_data, field_name, message="This field is required"):
    if(field_name in cleaned_data and cleaned_data[field_name] is None):
        self._errors[field_name] = self.error_class([message])
        del cleaned_data[field_name]

И тогда в чистом методе моей формы у меня есть:

def clean(self):
    cleaned_data = super(FormClass, self).clean()
    if(condition):
        self.validate_required_field(cleaned_data, 'field_name')

Пока у меня это отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...