Python 为什么我的Django表单没有出现任何错误?

Python 为什么我的Django表单没有出现任何错误?,python,django,forms,Python,Django,Forms,我有一个简单的表单,每当用户在表单上出错时,我都会在Django上引发一个验证错误。问题是,我设置了表单验证,但是当表单提交时使用了错误的值,它就会通过。我想知道为什么会发生这样的事,我怎么才能避免呢 这是html表单: <form id="ask-project" method="post" action="{% url 'ask-project' %}"> {% csrf_token %} <input required="required" class="for

我有一个简单的表单,每当用户在表单上出错时,我都会在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>
forms.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
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
类AskProjectForm(forms.ModelForm):
类元:
模型=AskProject
字段=['prenom']
def清洁剂(自身):
prenom=自清理的_数据['prenom']
如果len(prenom)<3:
raise ValidationError('Votre prénom doit etre plus long que 1 caractère'))
返回prenom

我做错什么了吗?

按照你所使用的模式,这种问题是不可避免的,而且是每天都会发生的。第一件事是不要像看上去那样手动渲染表单。这意味着当用户输入无效数据时,您不会显示任何反馈。考虑使用<代码> {{窗体} //>代码> <代码> {{表单> AsStase}} <代码>等,或使用如下描述的所有信息呈现字段:

第二个问题是,无论表单是否有效,在提交表单时都会重定向。建议的模式是仅在表单有效时重定向。因此,即使你应用了第一段中的建议,你仍然没有得到所需的反馈。考虑实施手册中建议的表格。下面是一份直接副本

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语句来打印字符串及其长度,看看是否相符(或者您的方法是否被调用)

是错误的数据保存在数据库中,还是只是错误没有显示在模板中,但数据没有保存?数据仍然保存在数据库中,没有错误显示我过去是这样做的,但使用小部件处理类、占位符、标签和所有这些东西很麻烦,这就是为什么我试图直接在htmlSorry上做,你们误解了,django表单。这当然比你想做的容易多了。发明它是为了让它更容易:)