2016-11-30 30 views
0

新しいDjangoユーザがここにあります。 GETリクエストでDjangoのsuccess_url()へのアクセスを制限しようとしています。私はこの質問を最初にしたわけではないことを認識していますが、私はDjangoの一般的なクラスベースのビューと組み合わせてこれを達成しようとしています。一般的なビューはよりクリーンで、速く、より慣用的に見えます。私は彼らが仕事に絶対に不適格でない限り、できるだけそれらを使いたいです。Djangoのsuccess_url()へのアクセスを制限する

基本的には、アカウントを作成せずに私にメッセージを送信するだけの非ユーザ向けの簡単な連絡フォームを作成しています。これらのタイプの連絡先を処理する連絡先アプリを作成しました。 ModelFormを作成しました。これは、contact.htmlでDjangoのFormViewを使ってレンダリングしています。人がフォームを提出すると、自分のurlを持つthanks.htmlでレンダリングされたクールな感謝のメッセージが届きます。

しかし、連絡フォームをPOSTすると、感謝のメッセージが表示されます。現在、私のサイトに行き、「/ contact/thanks /」と入力すると、フォームを送信したかどうかに関わらず、thanks.htmlがレンダリングされます。 Djangoのsuccess_urlは、デフォルトではGETリクエストにデフォルト設定されています。ここで

が私の見解です:

class MyContact(FormView): 
    template_name = 'contact.html' 
    form_class = ContactForm 
    success_url = 'thanks' 

は、ここに私のフォームです:

ContactForm(forms.ModelForm): 
    class Meta: 
     model = Contact 
     fields = ['email_address', 'message_body'] 

ここでhtmlフォームはcontact.htmlである:

<form action="" method="POST">{% csrf_token %} 
    {{ form|crispy }} 
    <button type="submit" class="send btn btn-secondary">Send Message</button> 
    </form> 

私が最初に考えたのは私の連絡先を飾ることでしたこのようなrequire_POST()デコレータのapp url:

理由はDjangoのsuccess_url()デフォルトでGETリクエストに
urlpatterns = [ 
url(r'^thanks/$', require_POST(views.ThanksPageView.as_view()), name='thanks'), 

]

これは動作しません。

これに最も慣れ親しんだ方法は何ですか? Djangoは 'バッテリーが含まれている'フレームワークなので、私は 'duck-tape'を使いたくないので、私のビューやURLにアドホックなロジックを実装したくないという意味です。

申し訳ありませんが、ドキュメントや質問アーカイブで何かを見逃しました。

答えて

2

慣用的なアプローチを求めているので、私はメッセージフレームワーク、具体的にはSuccessMessageMixinを考えます。これにより、あなたに成功メッセージを追加することができます。連絡先フォーム自体と/thanks/ページのURLパターンは必要ありません。

+0

ありがとうmhkuu! SuccessMessageMixinは素晴らしいです。私はまだそれを微調整していますが、実際には動作しています。今のところ、実際にはsuccess_urlを主張していますが、このスレッドを更新していきます。 –

+0

あなたはそうです、私は/ thanks/urlを一掃することができましたが、FormViewのsuccess_url変数に/ contact/urlを割り当てる必要がありました。連絡先ページにメッセージが表示されますが、これは問題ありません。私は本当に感謝のメッセージを私は推測する必要はありません。再度、感謝します。 –

関連する問題