1. ホーム
  2. python

[解決済み] Django はパラメータを指定して redirect() を返します。

2023-02-17 10:22:40

質問

ビューの関数で、別のビューを呼び出してデータを渡したいのですが、どうすればよいでしょうか。

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