Как заставить работать валидатор пользовательских форм Django?

#django #forms #validation

#джанго #формы #утверждение

Вопрос:

Я работаю над пользовательским редактором для своих форм Django. Необъяснимо, но я не могу получить желаемый результат. Вот мой код

 from django import forms from django.core import validators from django.core.exceptions import ValidationError from .models import Vote from django.core.validators import MaxValueValidator, MinValueValidator   def use_one(value):  if value != 1:  raise forms.ValidationError("Value is not 1!")  class MyForm(forms.Form):    main_form = forms.IntegerField(validators = [use_one],   label= 'Main',   required = False,  widget = forms.NumberInput(  attrs={'id': 'mainInput',  'name': 'main,  'href': '#',  'value': '',  'class': "form-control"}))  

Есть какие-нибудь мысли?

views.py

 form = MyForm()  main_result = request.GET.get(main_form)  form.fields['main_form_result'].initial = main_result  context = {form: form}  

Комментарии:

1. Как вы используете эту форму в представлении?

2. Обновил приведенный выше код с помощью логики представлений

3. Ну, вы никогда не проверяете свою форму.

4. Как получилось, что у меня был встроенный валидатор, однако, например main_form = forms.IntegerField(validators = [MinValueValidator(0)]) , я получаю сообщение об ошибке проверки, когда мне не нужно проверять свою форму в представлении?

Ответ №1:

Хорошо, что вы никогда не подтверждаете свою форму. Вы должны перейти request.GET к форме и позволить форме подтвердить ее, так что:

 def some_view(request):  form = MyForm(request.GET)  form.is_valid()  context = {'form': form}  return render(request, 'some-template.html', context) 

Часто формы отправляются как запрос POST, особенно если они создают, обновляют или удаляют сущности.

Комментарии:

1. Итак, ранее я никогда не проверял свою форму, и встроенный валидатор работал примерно так: main_form = forms.IntegerField(validators = [MinValueValidator(0)]) не могли бы вы кратко объяснить, почему здесь возникает ошибка проверки, когда я не проверяю свою форму в представлении?

2. @nick_rinaldi: это не вызовет ошибку валидатора, если вы не передадите ему данные. Вы уверены, что это не вызвало еще одной ошибки? Неограниченная форма недопустима/недопустима, то есть просто неограничена. Значение .is_valid() всегда будет возвращать значение false, если вы не вызываете его с request.GET помощью или request.POST (или другого объекта, подобного словарю).

3. Нет, я хочу сказать, что приведенный выше код в моем комментарии вызывает ошибку валидатора, когда я передаю его данные на внешний интерфейс. Даже если я вызову .is_valid() в своей форме, как в этом коде, form = MyForm(request.GET) form.is_valid() я получу сообщение об ошибке, в котором говорится, что 'NoneType' object has no attribute 'none'

4. @nick_rinaldi: .is_valid() не должен вызывать исключения: он ловит все ValidationError s. Так что, если это вызывает ошибку, это означает, что что-то сломано. Можете ли вы поделиться обратной связью, отредактировав вопрос?

5. Я не могу, я не могу поделиться своей кодовой базой заданий, поэтому я изменил код в вопросе, чтобы создать пример проблемы.