2010-12-10 1 views
1

私はDjangoのサンプルを見てきましたが、まともなエラー処理があることがわかりました。しかし、もっと良いアプローチがあるかどうかを知りたいのですが、Djangoでフォームの検証エラーを処理する一般的なパターンです。これは私がhereを発見したサンプルです:特にDjangoで良いフォーム検証を書くには?

def contact(request): 
    if request.method == 'POST': # If the form has been submitted... 
     form = ContactForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): # All validation rules pass 
      # Process the data in form.cleaned_data 
      # ... 
      return HttpResponseRedirect('/thanks/') # Redirect after POST 
    else: 
     form = ContactForm() # An unbound form 

    return render_to_response('contact.html', { 
     'form': form, 
    }) 

、私は思っていた:

  1. どのようにビュー「/ありがとう/」フォームが検証されたことを確認してください?フォームの検証を次のビューに渡す一般的な方法はありますか?または、リクエストのセッションでフラグを設定するなど手動で何か処理を行う必要がありますか?

  2. フォームが有効ではなく、送信時にページが表示された場合、ユーザーがブラウザを更新した場合、POSTデータを再度送信するかどうか尋ねることがないように、

編集:私は手動で「/ありがとう/」URLを入力するか、歴史のページを前後に行くと誤って検証されている任意のフォームなしでそれをopenningユーザーのような例を参照しています#1に関して。 (「ありがとう」ページがまだ表示されているのですか、またはなぜ私たちが感謝の気持ちを持っているのかを何らかの形で再確認する必要があります)。

答えて

1
  1. ビューはフォームが有効である場合にのみ呼び出されますので、フォームが検証されたことを確認することができます...

  2. ページは、POSTリクエストを介して生成されている場合は、ブラウザが常に要求されますあなたがリフレッシュするときに...私はこれを避けるための唯一の方法は、別のページにリダイレクトするだろうと思う!

+0

1.私は、ユーザーが手作業で '/ thanks /' URLを入力したり、履歴ページを前後に移動したり、フォームが検証されずに誤って開くなどの場合を求めていました。 (私たちはまだ「ありがとう」ページを表示しているのですか?または、なぜ私たちが感謝の気持ちでいるのかを何とか再検証する必要があります) – aligf

+0

2.同じビューにリダイレクトする方法はあるのでしょうか?たぶん私はリクエストセッションを使用する必要がありますか? – aligf

+0

リダイレクトしている場合は、 'request'に格納されているデータが失われているので、そのセッションを使わなければなりません。おそらく、別のビューを作成する必要はないでしょうし、フォームビューでテンプレートをレンダリングしてそこに戻すこともできます...必要以上に注意深くしようとしていると思いますが、フォームデータがデータベースに2回保存されることを避け、ユーザーが実際に何かを破壊することはできません。 –

1

方法「/感謝/」のビューは、フォームが検証されたことを確認することができますか?

form.is_valid()は、フィールドや必要に応じて任意の組み合わせ、コーナーケースなどを徹底的に確認する必要があります。基本的にはそれです。ビューを認識していますが、レンダリングするとフォームは有効です。セッションに冗長な情報を含める必要はありません。

フォームが有効でなく、送信時にページが表示され、ユーザーがブラウザをリフレッシュすると、POSTデータを再度表示するようにユーザーに求めない場合?

私は何がポイントになるか分かりません。フォームにエラーがあり、ユーザーが修正したり離したりする可能性があります。フォームの再送信を要求しないページをレンダリングするには、有効な場合と同様にリダイレクトを使用できます。その場合、エラーマークアップは手動で行う必要があります。

+0

#1については私の質問編集をご覧ください。元のビューからのリダイレクトに関して、エラーマークアップを行うには、セッションにPOST要求値を保存する必要がありますか? HttpResponseRedirectでPOSTリクエストを模倣するためのルーチン的な方法はありますか? – aligf

関連する問題