Почему моя форма Django не вызывает ошибку проверки?

#django #forms

#джанго #формы

Вопрос:

Я прочитал большинство случаев SO, касающихся этой проблемы, но все они довольно специфичны, поэтому я пришел сюда за помощью.

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

Что я пытаюсь сделать, так это сделать так, чтобы, когда пользователь вводит большее число в нижней границе, чем значение с высокой границей, для пользователя вызывалась ошибка проверки, которую он мог видеть на переднем конце, и результаты не отображались. Я немного новичок в работе с формами Django, но я могу предоставить свой код, и, возможно, кто-нибудь сможет предложить решение

forms.py

 class PlayerForm(forms.Form):  # player forms  points_high = forms.IntegerField(validators = [MinValueValidator(0)],  min_value=0,   label = 'Reviews',  required = False,  widget = forms.NumberInput(  attrs={'id': 'pointsHigh',  'name': 'pointsHigh',  'href': '#',  'value': '',  'class': "form-control"}))   points_low = forms.IntegerField(validators = [MinValueValidator(0)],   min_value=0,   required = False,  widget = forms.NumberInput(  attrs={'id': 'pointsLow',  'name': 'pointsLow',  'href': '#',  'value': '',  'class': "form-control"}))   def check_bounds(self):  """custom validation to check if low bound value is higher than high bound value"""  data = self.cleaned_data  player_low = data['player_low']  player_high = data['player_high']   if player_low and player_high:  if player_low gt; player_high:  raise forms.ValidationError(_("Low bound value cannot be higher than high bound value!"))    return data  

views.py

 def player_points(request):   players_form = PlayerForm()   players_high = request.GET.get('players_high')  players_low = request.GET.get('players_low')   stat_kwargs = {points__lte: players_high,  points__gte: players_low}   players = Players.objects.filter(**stat_kwargs)   context = {  'players': players  'form': players_form  }   return render(request, 'nba/players.html', context)  

По сути, цель состоит в том, чтобы принять ввод пользователя, проверить его в нашей check_bounds функции и вернуть ошибку, если она не работает. Как я могу это сделать?

Ответ №1:

Форма не будет автоматически вызывать вашу функцию. Вам нужно будет добавить в свою форму место для вызова вашей функции. Одно из мест, где вы могли бы это сделать, — это переопределить функцию формы clean() . Что — то вроде этого:

 def clean(self):  cleaned_data = super().clean()  self.check_bounds()  

Это вызовет вашу функцию, когда ваша форма django обычно вызывает эту clean() функцию.

Кроме того, я не совсем понимаю назначение строки return data в вашей check_bounds() функции. По какой причине вы вставили туда эту строку?

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

1. Честно говоря, я просто подумал, что мы должны вернуть данные из этой функции. Честно говоря, я не совсем понимаю, почему он там. Я, по сути, следую шаблонам других людей для выполнения этого кода. Однако при реализации вашего метода, описанного выше, все ли выглядит хорошо? Как, по-моему check_bounds , метод? И, с точки зрения, не должен ли я также вызвать метод clean?

2. Если вы не собираетесь что-то делать с данными, которые будут возвращены из вашей функции, вам не нужна эта строка возврата. Кроме этого, ваша функция выглядит для меня нормально. Вам не нужно было бы вызывать clean() метод в вашем представлении, потому что метод вызывается автоматически с помощью функции форм django.

3. Это имеет смысл … могу я спросить, в чем смысл этой cleaned_data = super().clean() линии? Он не используется. Кроме того, я не получаю ошибку проверки, когда границы смещены, как и ожидалось, так что здесь что-то должно быть не так. Тем не менее, спасибо за ответ!

4. Я думаю, что у меня была эта строка из-за учебника, которому я следовал, когда делал это в своем проекте некоторое время назад. Я не уверен, очень ли это важно или нет, чтобы иметь там. Может быть, попробуйте поместить код вашего check_bounds метода в переопределенный clean метод и посмотреть, сработает ли это? Или вы можете сказать мне, какие значения вы используете в своем диапазоне, чтобы проверить, правильно ли вызвана ошибка?

5. К сожалению, это не так. Я перепроверю свою логику.. но я пытаюсь понять, что в функции очистки, как моя форма узнает, какое значение существует в points_low и points_high ? Имеет ли это смысл? Например, как он считывает входное значение? Входное значение считывается в views.py насколько я понимаю