[python] 장고는 매개 변수와 함께 redirect ()를 반환합니다.
내 뷰 함수에서 다른 뷰를 호출하고 데이터를 전달하고 싶습니다.
return redirect('some-view-name', backend, form.cleaned_data)
, 여기서 백엔드는 registration.backends 객체이고 form.cleaned_data는 양식 데이터의 dict입니다 (하지만 둘 다 * args 또는 ** kwargs로 전송되어야 Don't mix *args and **kwargs in call to reverse()!
오류 발생 을 방지 할 수 있습니다 ). 내가 문서에서 찾은 것에서 :
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)이 어떻게 생겼는지? 백엔드와 clean_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에서 매개 변수를 정의해야합니다.
둘째, clean_data 사전에 어떤 일이 발생할 것으로 예상하는지 전혀 명확하지 않습니다. POST로 리디렉션 할 수 없다는 것을 잊지 마세요. 이것은 Django가 아닌 HTTP의 제한입니다. 따라서 clean_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))
댓글 후에 수정 됨
리디렉션 및 리버스 사용의 요점은 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)
# ...