2012-04-17 13 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

あり、ここでいくつかの問題がありますが、あなたの最大の問題は、あなたのビューである:もしelseブロックを取り出す

ビュー

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

+0

のようなものにリダイレクトすることができます。それは今働いている。本当にありがとう! – picomon

2

あなただけのタブを1つ欠けているように見えます。 form.is_validfalseを返しても、コードは/good/にリダイレクトされます。リダイレクトコードを次のようにif節の中に移動するだけで済みます。

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