2012-04-17 38 views
1

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

如何在使用户进入下一页之前验证这些字段?

模型

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

回答

0

这里有一些问题,但你的最大的问题是你的看法:

查看

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/') 

这到底是怎么发生的,它检查表格是否有效。但是,不管它是否有效,你仍然会返回/好/。这可能不是你想要做的。

你想要做的是这样的:

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)/

+0

非常感谢你们!它正在工作。万分感激! – picomon 2012-04-18 07:33:14

2

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

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

这应该够了。