2016-09-02 3 views
0

ユーザーは、POST要求(pkを含む)によって新しいフォームに移動するボタンをクリックします。これは、新しいフォームに余分なデータをあらかじめ入力するために使用されます。この時点では、データはデータベースに保存されていません。私はURLに沿ってこのpkを渡したくないので、GETを使ってビューを呼び出すことはできません。POSTのみ(GETではなく)を使用してCreateViewビューの初期フォーム値を設定するにはどうすればよいですか?

私はCREATEVIEWでget_initial()メソッドをオーバーライドしようとしたが、これは唯一のGET要求後に呼び出されるようです。

私もフィールドに簡単にアクセスできるようにしましたが、フォーム検証など(これはバニラCreateViewによって自動的に処理される)を処理するコードを書く必要があります。

ので、両方の要求がPOSTを経由して行われたときにレンダリングし、フォームの保存処理するための最良の方法は何ですか?

+1

これは奇妙な要件です。なぜGETを使ってフォームを表示できないのですか?これは正常なパターンです。 POSTはデータを表示せずに変更するためのものです。 –

+0

フォームは、ペットオーナーとそのペットの予約を予約することです。所有者とペットの名前をフォームにあらかじめ入力します。私は単に所有者のPKを渡すことはできません。なぜなら、そのペットのすべてが予定に入っているわけではないからです。ペットペットを渡すことはできません。 –

+0

..使用POST私はペットのPKのリストを渡すことができます。どのように私はGETを介してそれをきれいにやるのか分からない。 –

答えて

0

私はどうだろうか:

def post(self, request, **kwargs): 
    # Replace 'list_of_pets' with stuff that you'll definitely have in the first request 
    if 'list_of_pets' in request.POST: 
     # Provide initial data for form in get() 
     return self.get(request, **kwargs) 
    else: 
     # Provides automatic form validation 
     return super().post(request, **kwargs) 

get()方法では、あなたが最初のデータやその他もろもろを設定することができます。完全に別のメソッドを使用することもできますが、get()をオーバーライドすると、POSTリクエストなしで誰かがURLを徘徊してもすぐに不快な結果が得られないというメリットがあります(もちろん、他の方法もありません、 言ってるだけ')。

関連する問題