In meiner Ansichtsfunktion möchte ich eine andere Ansicht aufrufen und Daten an diese übergeben:
return redirect('some-view-name', backend, form.cleaned_data)
, wobei das Backend das Objekt register.backends ist und form.cleaned_data ein Diktat der Formulardaten ist (beide müssen jedoch entweder als * args oder ** kwargs gesendet werden, um Don't mix *args and **kwargs in call to reverse()!
Fehler zu vermeiden ). Nach dem, was ich in den Dokumenten gefunden habe:
def my_view(request):
...
return redirect('some-view-name', foo='bar')
Es sieht so aus, als müsste ich das Argument 'some-view-name' angeben, aber ist es nur der Name der Ansichtsfunktion oder der Name der URL? Deshalb möchte ich es ähnlich machen wie bei der Django-Registrierung, wobei:
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, kann ich jetzt direkt meine Ansichtsfunktion aufrufen oder muss ich eine URL dafür angeben? Und was ist wichtiger, wie sollte mein Funkanruf (und ggf. eine URL) aussehen? Sowohl das Backend als auch die bereinigten Daten werden für eine spätere Verwendung nur durch diese Ansicht geleitet. Ich habe es versucht, aber es ist unangemessen:
url(r'^link/$', some-view-name)
def some-view-name(request, *args):
So gut wie das :
return redirect('some_url', backend=backend, dataform.cleaned_data)
url(r'^link/$', some-view-name)
def some-view-name(request, backend, data):
immer noch NoReverseMatch. Aber bei der Django-Registrierung habe ich so etwas gesehen:
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) # ...
quelle