[解決済み] Django はパラメータを指定して redirect() を返します。
質問
ビューの関数で、別のビューを呼び出してデータを渡したいのですが、どうすればよいでしょうか。
return redirect('some-view-name', backend, form.cleaned_data)
ここで、backend は registration.backends オブジェクトで、form.cleaned_data はフォームデータのディクショナリです (ただし、両方とも *args または **kwargs として送られなければなりません。
Don't mix *args and **kwargs in call to reverse()!
エラーを発生させないために、両方とも *args か **kwargs として送られなければなりません)。私がdocsで見つけたものから:
def my_view(request):
...
return redirect('some-view-name', foo='bar')
引数として 'some-view-name' を与える必要があるようですが、これは単にビュー関数の名前なのでしょうか、それともURLの名前なのでしょうか?ということで、django-registrationで行われている方法と同じようにしたいのですが、:
to, args, kwargs = backend.post_registration_redirect(request, new_user)
return redirect(to, *args, **kwargs)
def post_registration_redirect(self, request, user):
return ('registration_complete', (), {})
さて、それではビュー関数を直接呼び出すことができるのか、それともそのためのURLを提供する必要があるのでしょうか?そしてさらに重要なことは、私の関数呼び出し(と必要ならURL)はどのように見えるべきかということです。バックエンドとcleaned_dataの両方は、後で使用するためにこのビューを介して渡されるだけです。私はこれを試しましたが、それは不適切です。
url(r'^link/$', some-view-name)
def some-view-name(request, *args):
これと同様に:
return redirect('some_url', backend=backend, dataform.cleaned_data)
url(r'^link/$', some-view-name)
def some-view-name(request, backend, data):
はまだNoReverseMatch 。しかし、django-registrationでは、このようなものがありました。
url(r'^register/$',register,{'backend': 'registration.backends.default.DefaultBackend'}, name='registration_register'),
def register(request, backend, success_url=None, form_class=None,
disallowed_url='registration_disallowed',
template_name='user/login_logout_register/registration_form.html',
extra_context=None):
どのように解決するのですか?
まず、URLの定義がパラメータを全く受け付けない状態になっています。URL からビューにパラメータを渡したい場合は、urlconf でパラメータを定義する必要があります。
第二に、cleaned_data辞書に何が起こるかを期待しているのか、まったく明確でありません。POST にリダイレクトできないことを忘れないでください - これは HTTP の制限であって、Django の制限ではありません - ですから、 cleaned_data は URL パラメータ (ひどい) か、少し良いのは一連の GET パラメータである必要があります - ですから URL は以下のような形式である必要があります。
/link/mybackend/?field1=value1&field2=value2&field3=value3
といった具合に記述します。この場合、field1、field2、field3は
ではなく
URLconf の定義に含まれていません。
request.GET
.
だからあなたのurlconfは、次のようになります。
url(r'^link/(?P<backend>\w+?)/$', my_function)
となり、ビューは以下のようになります。
def my_function(request, backend):
data = request.GET
となり、その逆は(インポート後に
urllib
):
return "%s?%s" % (redirect('my_function', args=(backend,)),
urllib.urlencode(form.cleaned_data))
コメント後に編集
あなたが行っているように、redirectとreverseを使用する全体のポイントは、あなたがURLに行くことです - それは、ブラウザが新しいURLにリダイレクトするようにするHttpコードを返し、それを呼び出します。
単にコード内からビューを呼び出したい場合は、単に直接それを行います - 逆を使用する必要はまったくありません。
とはいえ、データを保存したいだけなら、セッションに入れればいいだけです。
request.session['temp_data'] = form.cleaned_data
関連
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] HTMLページからのリダイレクト
-
[解決済み] jQuery Ajax呼び出し後のリダイレクトリクエストを管理する方法
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
-
[解決済み】Djangoでnull=Trueとblank=Trueの違いは何ですか?
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] Pythonのargparseを使った隠し引数の作成
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
-
[解決済み] Pythonの辞書にあるスレッドセーフについて
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例