Проверка формы 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
?
Ответы
Ответ 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')
Он отлично работал у меня до сих пор.