Django: ошибки проверки формы при создании формы - PullRequest
0 голосов
/ 03 февраля 2019

Допустим, у меня есть форма Django с ChoiceField:

class MyForm(forms.Form):
    name = forms.CharField(label="Name", required=True)
    some_object = forms.ChoiceField(label="Object", choices=[(0, '-----')] + [(x.id, x.name) for x in Obj.objects.all()])

Поле Choise инициализируется списком объектов, возглавляемых «пустым выбором».Там нет объекта с pk = 0.В этой форме у меня есть метод clean ():

def clean(self):
    if not Obj.objects.filter(self.cleaned.data['some_object'].exists():
        self.errors.update({'some_object': ['Invalid choice']})

Он хорошо работает, когда я отправляю форму на сервер, если данные в ней не соответствуют условиям, field.is_valid возвращает False иЯ отрисовываю форму с сообщениями об ошибках.Но когда я создаю пустую форму, подобную этой:

if request.method == 'GET':
    data = {'name': 'Untitled',
            'some_object': 0}
    form = MyForm(data)
    return render(request, 'app\template.html', {'form': form})

Django отображает форму с сообщением об ошибке («Неверный выбор»), даже если форма была только что создана, а «Выбор объекта» предназначался для установки в пустойпозиция.Можно ли отключить метод clean () в определенных случаях?Или, может, я все делаю неправильно?Как лучше всего создавать пустую форму?

1 Ответ

0 голосов
/ 03 февраля 2019

Проблема в том, что форма с любым переданным ей словарем данных считается «связанной» формой, с которой Django будет выполнять проверку данных.Подробности смотрите здесь: https://docs.djangoproject.com/en/2.1/ref/forms/api/#bound-and-unbound-forms

Вы хотите, чтобы «несвязанная» форма имела здесь начальные значения по умолчанию, просто установите свойство initial в полях формы.Подробности см. Здесь: https://docs.djangoproject.com/en/2.1/ref/forms/fields/#initial

...