Почему моя форма Django не выдает ошибку валидации?
Я прочитал большинство SO случаев, касающихся этой проблемы, но все они довольно специфичны, поэтому я пришел сюда за помощью.
Я создал фильтр диапазона в своем проекте Django, который принимает два входных сигнала, установленных на нижнюю и верхнюю границы, и отображает диапазон данных в пределах этих границ.
Я пытаюсь сделать так, чтобы, когда пользователь вводит большее число в нижнем пределе, чем в верхнем пределе, возникала ошибка ValidationError, которую пользователь мог бы увидеть на лицевой стороне, и результаты не отображались. Я немного новичок в работе с формами 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 > 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
и вернуть ошибку, если он не работает. Как я могу это сделать?
Форма не будет вызывать вашу функцию автоматически. Вам нужно будет добавить в форму место для вызова вашей функции. Это можно сделать, переопределив функцию формы clean()
. Что-то вроде этого:
def clean(self):
cleaned_data = super().clean()
self.check_bounds()
Это вызовет вашу функцию, когда ваша форма django обычно вызывает функцию clean()
.
Также я не совсем понимаю назначение строки return data
в вашей функции check_bounds()
. По какой причине вы поместили туда эту строку?