1

我想确保用户在重定向到下一页之前填写所有字段。如果他们没有填写这些字段,它应该会引发一个错误,告诉他们在继续之前填写这些字段。为此,我编写了以下代码。但我面临的问题是,当我没有填写这些字段时,它把我带到了下一页,而不是让我回到同一页面,并且没有引发任何错误。

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

楷模

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 %}
4

2 回答 2

2

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

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

这应该足够了。

于 2012-04-17T19:16:00.030 回答
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)/

于 2012-04-17T19:27:12.313 回答