Подтвердить что ты не робот

Проверка формы Django: создание "обязательного" условного?

Я новичок в 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?

4b9b3361

Ответ 1

Это делается с помощью метода 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')

Ответ 2

Я обнаружил, что мне нужен "стандартный" способ сделать это, так как мои формы имеют несколько условно обязательных полей. Поэтому я создал суперкласс со следующим методом:

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')

Он отлично работал у меня до сих пор.