Django ModelForm验证不起作用

时间:2012-04-17 19:03:41

标签: python django

我想确保用户在重定向到下一页之前填写所有字段。如果他们没有填写字段,它应该引发错误,告诉他们在进行之前填充字段。所以,为此,我写下面的代码。但我遇到的问题是,当我没有填写字段时,它将我带到下一页,而不是将它返回到同一页面,并且它没有引起任何错误。

在将用户带到下一页之前,如何让它验证这些字段?

模型

from django.core.exceptions import ValidationError

 class Memb(models.Model):
       slug=models.CharField(max_length=100)
       member=models.CharField(max_length=100)

       def __unicode__(self):
           return self.member, self.slug

       def clean_slug(self):
             data=self.cleaned_data['slug']
             if "Testy" not in data:
                 raise ValidationError("Enter the correct name for this field")

  class MembForm(ModelForm):
        class Meta:
             model=Memb
             fields=('slug','member') 

浏览

def my_memb(request):
    if request.method=="POST":
            form=MembForm(request.POST)
            if form.is_valid():
                    data=form.cleaned_data
                    form.save()
            return HttpResponseRedirect('/good/')
    else:
            form=MembForm()
    return render_to_response('member.html',{'MembForm':MembForm}, context_instance=RequestContext(request))

模板

 {% block content %}
     <form action="" method="POST">
          {{MembForm.as_p}}
   <input type="submit" value="Add"/>
   </form>
  {% endblock %}

2 个答案:

答案 0 :(得分:2)

您似乎只缺少一个标签。即使/good/返回form.is_valid,您的代码也会重定向到false。您只需将重定向代码移动到if子句中,如下所示:

...
if form.is_valid():
    data=form.cleaned_data
    form.save()
    return HttpResponseRedirect('/good/')
...

这应该足够了。

答案 1 :(得分:1)

这里有一些问题,但你最大的问题是你的观点:

浏览

def my_memb(request):
    if request.method=="POST":
            form=MembForm(request.POST)
            if form.is_valid():
                    data=form.cleaned_data
                    form.save()
            return HttpResponseRedirect('/good/')
    else:
            form=MembForm()
    return render_to_response('member.html',{'MembForm':MembForm}, context_instance=RequestContext(request))

取出if else块:

    if request.method=="POST":
            form=MembForm(request.POST)
            if form.is_valid():
                    data=form.cleaned_data
                    form.save()
            return HttpResponseRedirect('/good/')

这里发生的是,它会检查表单是否有效。但是,无论它是否有效,你仍然会返回/ good /。这可能不是你想要做的。

你想要做的是:

    if request.method=="POST":
            form=MembForm(request.POST)
            if form.is_valid():
                    data=form.cleaned_data
                    form.save()
                    return HttpResponseRedirect('/good/')
            else:
                return HttpResponse #something else, or maybe just the form

当然,这可以与下面的代码一起整合,所以你真正需要的是:

    if request.method=="POST":
            form=MembForm(request.POST)
            if form.is_valid():
                    data=form.cleaned_data # by the way, what is this for? seems extraneous.
                    form.save()
                    return HttpResponseRedirect('/good/')

我注意到的其他一些事情:

  class MembForm(ModelForm):
        class Meta:
             model=Memb
             fields=('slug','member')

使用模型表单时无需显式定义字段。这是使用它们的全部意义;)有时候这样做,有时候要排除它们,但在你的例子中我没有看到它。

我也不确定“clean_slug”方法是什么让你认为默认功能没有做得更好。但是,这可能只是一个片段。

最后,您将重定向到名为“good”的页面。无论用户输入什么,这都是相同的,你应该问自己这是否是所希望的行为。您可能想要重定向到/ good /(someuniqueid)/

之类的内容