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

タブが1つだけ欠けているようです。を返して/good/も、コードはにリダイレクトされます。次のように、リダイレクトコードをif句内に移動する必要があります。form.is_validfalse

...
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 に答える