W mojej funkcji widoku chcę wywołać inny widok i przekazać do niego dane:
return redirect('some-view-name', backend, form.cleaned_data)
, gdzie backend jest obiektem registration.backends, a form.cleaned_data jest dyktatem danych formularza (ale oba muszą być wysłane jako * args lub ** kwargs, aby zapobiec zgłaszaniu Don't mix *args and **kwargs in call to reverse()!
błędów). Z tego, co znalazłem w dokumentach:
def my_view(request):
...
return redirect('some-view-name', foo='bar')
Wygląda na to, że muszę podać argument „nazwa-widoku”, ale czy jest to tylko nazwa funkcji widoku, czy nazwa adresu URL? Chciałbym więc zrobić to podobnie do sposobu, w jaki jest to robione w rejestracji django, gdzie:
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', (), {})
OK, czy mogę teraz bezpośrednio wywołać moją funkcję widoku, czy też muszę podać jej adres URL? A co ważniejsze, jak powinno wyglądać moje wywołanie funkcji (i adres URL w razie potrzeby)? Zarówno zaplecze, jak i clean_data są przekazywane przez ten widok do późniejszego użycia. Próbowałem tego, ale jest to niewłaściwe:
url(r'^link/$', some-view-name)
def some-view-name(request, *args):
Tak dobrze jak to :
return redirect('some_url', backend=backend, dataform.cleaned_data)
url(r'^link/$', some-view-name)
def some-view-name(request, backend, data):
nadal NoReverseMatch. Ale w rejestracji django widziałem coś takiego:
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):
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) # ...
źródło