Переопределить проверку данных на одном элементе формы django - PullRequest
13 голосов
/ 03 декабря 2010

В моей форме есть раскрывающийся список выбора, который заполняется данными из модели (директора). Значение этого раскрывающегося списка не нужно сохранять; на самом деле он используется только для динамического запуска другого элемента формы (раскрывающегося списка «Фильмы»). Поэтому, когда пользователь выбирает директора, он динамически заполняет второй список фильмами, прикрепленными к этому директору.

Первый элемент первого списка - «Все директора». Вместо фильтрации списка фильмов он позволяет показывать все фильмы во втором списке, поскольку выбраны все режиссеры.

Если пользователь выбирает конкретного режиссера, а затем фильм, форма отправляется правильно. Проблема в том, что если пользователь выбирает «Все режиссеры», а затем выбирает фильм, при отправке формы он говорит мне, что мой выбор для режиссеров недействителен, поскольку он не является одним из доступных вариантов. В этом случае доступным выбором (я полагаю) является один из существующих объектов Director.object, который находится в базе данных. Но поскольку мне нет дела до директора, мне не нужно, чтобы эта запись была действительной. Мне просто нужно, чтобы фильм был действительным.

Я использую ModelForm. Как можно отключить или переопределить проверку данных в поле формы «Директор», чтобы он игнорировал ошибку, которую генерирует это поле?

Ответы [ 2 ]

26 голосов
/ 03 декабря 2010

Самый простой подход - это определить собственный метод проверки формы, например:

class MyForm(forms.ModelForm):
    class Meta:
        model = WhateverModel

    def clean(self):
        super(MyForm, self).clean() #if necessary
        if self.cleaned_data.get('film') and 'director' in self._errors:
            del self._errors['director']
        return self.cleaned_data                            

Более подробное объяснение см. http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other и http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-clean-method длякак это относится к ModelForms.

8 голосов
/ 25 мая 2013

По какой-то причине принятый ответ не сработал для меня (не знаю, вызвал ли он изменения, или я использую встроенную форму или что-то еще), но переопределение full_clean сработало:

class MyForm(forms.ModelForm):
    def full_clean(self):
        super(MyForm, self).full_clean()
        if self.cleaned_data.get('film') and 'director' in self._errors:
            del self._errors['director']
...