Джанго: Отвержение чистого () метод в формах - вопрос о подъеме ошибок

Я делал вещи как это в чистом методе:

if self.cleaned_data['type'].organized_by != self.cleaned_data['organized_by']:
      raise forms.ValidationError('The type and organization do not match.')
if self.cleaned_data['start'] > self.cleaned_data['end']:
      raise forms.ValidationError('The start date cannot be later than the end date.')

Но тогда это означает, что форма может только поднять одну из этих ошибок за один раз. Есть ли путь к форме, чтобы поднять обе из этих ошибок?

ОТРЕДАКТИРУЙТЕ № 1: Любые решения для вышеупомянутого отличные, но любили бы что-то, что будет также работать в сценарии как:

if self.cleaned_data['type'].organized_by != self.cleaned_data['organized_by']:
      raise forms.ValidationError('The type and organization do not match.')
if self.cleaned_data['start'] > self.cleaned_data['end']:
      raise forms.ValidationError('The start date cannot be later than the end date.')
super(FooAddForm, self).clean()

Где FooAddForm - ModelForm и имеет уникальные ограничения, которые могли бы также вызвать ошибки. Если бы кто-либо знает о чем-то как этот, который был бы большим...

9
задан Monika Sulik 22 January 2010 в 13:48
поделиться

3 ответа

From the docs:

https://docs.djangoproject.com/en/1.7/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

from django.forms.util import ErrorList

def clean(self):

  if self.cleaned_data['type'].organized_by != self.cleaned_data['organized_by']:
    msg = 'The type and organization do not match.'
    self._errors['type'] = ErrorList([msg])
    del self.cleaned_data['type']

  if self.cleaned_data['start'] > self.cleaned_data['end']:
    msg = 'The start date cannot be later than the end date.'
    self._errors['start'] = ErrorList([msg])
    del self.cleaned_data['start']

  return self.cleaned_data
18
ответ дан 4 December 2019 в 07:14
поделиться
errors = []
if self.cleaned_data['type'].organized_by != self.cleaned_data['organized_by']:
      errors.append('The type and organization do not match.')
if self.cleaned_data['start'] > self.cleaned_data['end']:
     errors.append('The start date cannot be later than the end date.')

if errors:
    raise forms.ValidationError(errors)
7
ответ дан 4 December 2019 в 07:14
поделиться

Если вы предпочитаете, чтобы сообщения об ошибках прикреплялись к форме, а не к конкретным полям, вы можете использовать ключ "__all__" вот так:

msg = 'The type and organization do not match.'
self._errors['__all__'] = ErrorList([msg])

Также, как объясняет документация Django: "если вы хотите добавить новую ошибку в определенное поле, вам следует проверить, существует ли уже такой ключ в self._errors или нет. Если нет, создайте новую запись для данного ключа, сохранив пустой экземпляр ErrorList. В любом случае вы можете добавить свое сообщение об ошибке в список для данного имени поля, и оно будет показано при отображении формы."

3
ответ дан 4 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: