web-dev-qa-db-ja.com

Django return redirect()with parameters

私のビュー関数では、別のビューを呼び出してデータを渡したいです:

_return redirect('some-view-name', backend, form.cleaned_data)
_

ここで、バックエンドはregistration.backendsオブジェクトであり、form.cleaned_dataはフォームデータの辞書です(ただし、Don't mix *args and **kwargs in call to reverse()!エラーが発生しないように、両方を* argsまたは** kwargsとして送信する必要があります)。私がドキュメントで見つけたものから:

_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を提供する必要がありますか?さらに重要なことは、私のfunciotn呼び出し(および必要に応じて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です。しかし、ジャンゴ登録では、次のようなものを見ました:

_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):
_
69
muntu

まず、URL定義はパラメーターをまったく受け入れません。 URLからビューにパラメーターを渡す場合は、urlconfでパラメーターを定義する必要があります。

第二に、cleaned_dataディクショナリに何が起こると期待されているのか、まったく明確ではありません。 POST-これはHTTPの制限であり、Django-したがって、cleaned_dataはURLである必要があります)にリダイレクトできないことを忘れないでくださいパラメータ(恐ろしい)、またはわずかに優れた一連のGETパラメータ-したがって、URLは次の形式になります。

/link/mybackend/?field1=value1&field2=value2&field3=value3

等々。この場合、field1、field2、field3はnotであり、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))

コメントの後に編集

あなたがやってきたように、リダイレクトとリバースを使うことの全体的なポイントは、あなたがURLに行くことです-それはブラウザを新しいURLにリダイレクトさせ、それを呼び出すHttpコードを返します。

コード内からビューを単に呼び出したい場合は、直接呼び出してください。リバースをまったく使用する必要はありません。

ただし、データを保存するだけの場合は、セッションに配置するだけです。

request.session['temp_data'] = form.cleaned_data
57
Daniel Roseman

urls.py:

#...    
url(r'element/update/(?P<pk>\d+)/$', 'element.views.element_update', name='element_update'),

views.py:

from Django.shortcuts import redirect
from .models import Element


def element_info(request):
    # ...
    element = Element.object.get(pk=1)
    return redirect('element_update', pk=element.id)

def element_update(request, pk)
    # ...
43
roach