【问题标题】:Django-forms: Raise forms.ValidationError not workingDjango-forms:提高 forms.ValidationError 不起作用
【发布时间】:2020-02-11 09:55:13
【问题描述】:

我是 Django 的初学者,最近学习了表单验证。我实现了代码,但无法针对某些约束引发 ValidationError。

这是我后续的文件内容。

forms.py

from django import forms
from django.core import validators


class formClass(forms.Form):
    name = forms.CharField(max_length=128)
    email = forms.EmailField(max_length=256)
    text = forms.CharField(widget=forms.Textarea)
    catchBot = forms.CharField(required=False, widget=forms.HiddenInput,
                           validators=[validators.MaxLengthValidator(0)])

    def clean(self):
        cleaned_data = super(formClass, self).clean()
        t = self.cleaned_data.get('name')
        if t[0].lower() != 'd':
            raise forms.ValidationError('Name must start with d.')
        return cleaned_data

views.py

from django.shortcuts import render
from formApp import forms
from django.http import HttpResponseRedirect

def formNameView(request):
    formObj = forms.formClass()
    formDict = {'form': formObj}
    if request.method == 'POST':
        formObj = forms.formClass(request.POST)

        if formObj.is_valid():
            # SOME CODE
            print("NAME: " + formObj.cleaned_data['name'])
            print("EMAIL: " + formObj.cleaned_data['email'])
            return HttpResponseRedirect('/users')
    return render(request, 'formApp/forms.html', context=formDict)

我的有效输入效果很好,但我的无效输入不会发生这种情况。

例如:如果name = 'Alex',它应该引发错误。但事实并非如此。 有人可以帮我吗?

编辑:

[添加了 forms.html 和可调用的验证器。]

以前,我使用validators callable 来引发ValidationError 而不是clean() 方法。但结果是一样的。 这是我的代码:

def checkForD(value):
    if value[0].lower() != 'd':
        raise forms.ValidationError('Name must start with d.')
.
.
.
# in my formClass()
name = forms.CharField(max_length=128, validators[checkForD])
...

Forms.html

<body>
<div class='container'>
  <div class='jumbotron'>
    <h3>Welcome to the form page.</h3>
    <h2>Please insert the form.</h2>
  </div>
  <form method="post">
    {{form.as_p}}
    {% csrf_token %}
    <input type="submit" value="Submit" class="btn btn-primary"/>
  </form>
</div>
</body>

【问题讨论】:

  • 会发生什么?它仍然打印姓名和电子邮件吗?
  • @DanielRoseman 是的,它在控制台上运行,但仅用于有效输入。该代码运行良好,但它没有在我的网页上显示 ValidationError。只是为了确认,我使用了验证器而不是 clean 方法,但问题仍然存在。
  • @DanielRoseman 为方便起见,我正在上传我的网页模板。我认为它没有任何用处,但我仍然应该向您提供我的方法。

标签: django python-3.x django-forms


【解决方案1】:

在您的 POST 块中,您已将 formObj 重新定义为绑定表单,但您没有替换上下文字典中的实例 - 所以传递给模板的是空的未绑定表单,不会出现错误显示在该模板上。

最简单的解决方法是将字典的定义移到函数的末尾:

formDict = {'form': formObj}
return render(request, 'formApp/forms.html', context=formDict)

现在将使用正确的实例并显示错误。

【讨论】:

  • 成功了!只是一个愚蠢的错误。我认为这是使用上下文字典而不初始化它的好方法。非常感谢。
【解决方案2】:

你可以试试这个:post中不要定义formDict,直接在return render中定义

return render(request, 'formApp/forms.html', {'form': formObj})

【讨论】:

    猜你喜欢
    • 2012-06-07
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2015-08-07
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    相关资源
    最近更新 更多