2012-04-17 66 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/') 
... 

這應該夠了。