私のビュー関数では、別のビューを呼び出してデータを渡したいです:
_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):
_
まず、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
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)
# ...