【问题标题】:Why does my Django form not raise Validation Error?为什么我的 Django 表单不会引发验证错误?
【发布时间】:2022-01-07 13:11:25
【问题描述】:

我阅读了大多数关于这个问题的 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 函数中检查它,如果它不起作用则返回错误。我该怎么做?

【问题讨论】:

    标签: django forms


    【解决方案1】:

    表单不会自动调用您的函数。您需要在表单中添加一个调用函数的位置。您可以这样做的一个地方是您可以覆盖表单clean() 函数。像这样的:

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

    当您的 django 表单通常调用 clean() 函数时,这将调用您的函数。

    另外,我不太明白 return data 在您的 check_bounds() 函数中的用途。你把那条线放在那里的原因是什么?

    【讨论】:

    • 老实说,我只是认为我们必须从这个函数返回数据。老实说,我不确定它为什么会在那里。我本质上是按照其他人的模板来执行此代码。但是,在实现上述方法时,一切看起来都好吗?比如,在我的check_bounds 中,方法是什么?而且,在视图中,我是否也不必调用 clean 方法?
    • 除非你打算对函数返回的数据做一些事情,否则你不应该需要那个返回行。除此之外,您的功能对我来说看起来不错。您不必在视图中调用 clean() 方法,因为该方法是从 django 表单函数的方式自动调用的。
    • 这很有道理.. 我能问一下cleaned_data = super().clean() 行的意义吗?它没有被使用。此外,当边界未对齐时,我没有收到验证错误,正如预期的那样,所以这里必须有一些东西。不过,感谢您的回复!
    • 我想我有这行是因为我不久前在我的项目中这样做时遵循的教程。我不确定它是否超级重要。也许尝试将 check_bounds 方法的代码放入覆盖的 clean 方法中,看看是否有效?或者你能告诉我你在你的范围内使用什么值来测试错误是否正确引发?
    • 不幸的是,它没有。我会仔细检查我的逻辑.. 但我想了解的是,在 clean 函数中,我的表单如何知道 points_lowpoints_high 中存在什么值?这有意义吗?比如,它如何读取输入值?据我了解,输入值是在views.py中读取的
    猜你喜欢
    • 2016-09-16
    • 2017-04-26
    • 2018-04-15
    • 2011-12-07
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多