#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 насколько я понимаю