【问题标题】:Why is my Django form not raising any errors?为什么我的 Django 表单没有引发任何错误?
【发布时间】:2017-09-30 03:31:09
【问题描述】:

我有一个简单的表单,每当用户在表单上做错事时,我想在 Django 上引发验证错误。问题是我设置了表单验证,但是当表单使用错误的值提交时,它会通过。我想知道为什么会发生这种情况以及如何避免这种情况?

这里是html表单:

<form id="ask-project" method="post" action="{% url 'ask-project' %}">
  {% csrf_token %}

  <input required="required" class="form-control form-text required" id="prenom" name="prenom" type="text">

  <button class="btn btn-default submit">Submit</button>
</form>

views.py:

def askProject(request):
    if request.method == 'POST':
        form = AskProjectForm(request.POST)
        if form.is_valid():
            save_it = form.save(commit=False)
            save_it.save()
            return redirect('/merci/') #success

forms.py:

class AskProjectForm(forms.ModelForm):
    class Meta:
        model = AskProject
        fields = ['prenom']

    def clean_prenom(self):
        prenom = self.cleaned_data['prenom']
        if len(prenom) < 3:
            raise ValidationError('Votre prénom doit etre plus long que 1 caractère.')
        return prenom

我做错了吗?

【问题讨论】:

  • 是错误的数据保存在数据库中还是只是错误没有显示在模板中但数据没有保存?
  • 数据仍然保存在数据库中并且没有错误显示

标签: python django forms


【解决方案1】:

对于您正在使用的模式,这类问题是不可避免的,而且是日常的。第一件事是不要像您似乎正在做的那样手动呈现表单。这意味着当用户输入无效数据时,您不会显示任何反馈。考虑使用{{ form }}{{ form.as_table }} 等或使用此处描述的所有信息呈现字段:https://docs.djangoproject.com/en/1.11/topics/forms/#rendering-fields-manually

第二个问题是你在提交表单时重定向,不管它是否有效。推荐的模式是仅在表单有效时重定向。因此,即使您应用了第一段中的建议,您仍然没有得到所需的反馈。考虑按照手册中的建议实施表格。直接复制过去

if request.method == 'POST':
    # create a form instance and populate it with data from the request:
    form = NameForm(request.POST)
    # check whether it's valid:
    if form.is_valid():
        # process the data in form.cleaned_data as required
        # ...
        # redirect to a new URL:
        return HttpResponseRedirect('/thanks/')

# if a GET (or any other method) we'll create a blank form
else:
    form = NameForm()

return render(request, 'name.html', {'form': form})

最后讨论一下为什么你的表单验证不起作用的具体情况,在你的 clean 方法中添加一个 print 语句来打印字符串和它的长度,看看它是否相符(或者你的方法是否被调用)

【讨论】:

  • 我曾经这样做过,但是使用小部件来处理类、占位符、标签和所有这些东西很麻烦,这就是我尝试直接在 html 上做的原因
  • 对不起,您误解了,django 表单。这肯定比您尝试做的要容易得多。发明它是为了让它更容易:)
猜你喜欢
  • 2016-09-16
  • 2022-01-07
  • 2017-04-04
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2020-05-11
相关资源
最近更新 更多