장고는 매개 변수와 함께 redirect ()를 반환합니다.


83

내 뷰 함수에서 다른 뷰를 호출하고 데이터를 전달하고 싶습니다.

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):

답변:


66

첫째, 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

이 뷰에서 clean_data에 대해 작업하지 않고 나중에 사용하기 위해 전달하면? clean_data dict에 많은 필드가 있으므로 get 문자열로 전달하는 것을 피하고 싶습니다. :)
muntu

이 댓글을 이해할 수 없습니다. 더 자세히 설명하고 필요한 경우 질문을 업데이트하십시오.
Daniel Roseman

이 두 번째보기는 추가 사용을 위해 전송 된 데이터 만 저장합니다. 하지만 URL을 제공해야하나요? 문서에서보기를 직접 호출하는 것처럼 보입니다. 또한 백엔드와 데이터가있는 사전을 redirect () (django-registration에서 수행됨)와 URL (등록 함수의이 dict와 같이)에 전송하기를 바랐지만 불가능하다고 생각합니까?
muntu

예 예 예 그게 다야 !! 세션을 완전히 잊고 너무 많은 시간을 낭비했습니다 : / 젠장, 감사합니다!
muntu

1
URL이 필요하지 않은 경우 함수를 호출하는 것이 좋습니다.
maxbellec

60

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)
    # ...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.