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

Переопределить проверку данных на одном элементе формы django

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

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

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

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

4b9b3361

Ответ 1

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

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.

Ответ 2

По какой-то причине принятый ответ не сработал у меня (не знаю, изменили ли оно что-то, или я использую встроенную форму или что), но переопределил 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']