web-dev-qa-db-fra.com

Django retourne redirect () avec des paramètres

Dans ma fonction de vue, je souhaite appeler une autre vue et lui transmettre des données:

return redirect('some-view-name', backend, form.cleaned_data)

, où backend est un objet registration.backends et form.cleaned_data est un dict de données de formulaire (mais les deux doivent être soit envoyés sous la forme * args, soit ** kwargs pour éviter de générer une erreur Don't mix *args and **kwargs in call to reverse()!). D'après ce que j'ai trouvé dans la documentation:

def my_view(request):
    ...
    return redirect('some-view-name', foo='bar')

Il semble que j'ai besoin de fournir l'argument 'nom-de-vue', mais s'agit-il simplement du nom de la fonction de vue ou du nom de l'URL? Je voudrais donc le rendre similaire à la façon dont cela est fait dans Django-registration, où:

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, maintenant, puis-je appeler directement ma fonction de visualisation ou dois-je lui fournir une URL? Et quoi de plus important, à quoi devrait ressembler mon appel (et une URL si nécessaire)? Le backend et les données nettoyées sont simplement passés à travers cette vue pour une utilisation ultérieure. J'ai essayé cela, mais c'est impropre:

url(r'^link/$', some-view-name)   
def some-view-name(request, *args):

Ainsi que cette :

return redirect('some_url', backend=backend, dataform.cleaned_data) 
url(r'^link/$', some-view-name)    
def some-view-name(request, backend, data):

toujours NoReverseMatch. Mais dans Django-registration, j'ai vu quelque chose comme ceci:

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

Tout d’abord, votre définition d’URL n’accepte aucun paramètre. Si vous souhaitez que les paramètres soient passés de l'URL dans la vue, vous devez les définir dans l'urlconf.

Deuxièmement, il n’est pas du tout clair ce que vous attendez du dictionnaire cleaner_data. N'oubliez pas que vous ne pouvez pas rediriger vers un POST - ceci est une limitation de HTTP, pas Django - donc vos données nettoyées doivent être une URL paramètre (horrible) ou, légèrement mieux, une série de paramètres GET - ainsi l'URL serait sous la forme:

/link/mybackend/?field1=value1&field2=value2&field3=value3

etc. Dans ce cas, champ1, champ2 et champ3 ne sont pas inclus dans la définition de URLconf - ils sont disponibles dans la vue via request.GET.

Donc, votre urlconf serait:

url(r'^link/(?P<backend>\w+?)/$', my_function)

et la vue ressemblerait à ceci:

def my_function(request, backend):
   data = request.GET

et l'inverse serait (après avoir importé urllib):

return "%s?%s" % (redirect('my_function', args=(backend,)),
                  urllib.urlencode(form.cleaned_data))

Edité après commentaire

L’utilisation de redirect et reverse, comme vous l’avez fait auparavant, c’est que vous accédez à l’URL - elle renvoie un code Http qui force le navigateur à se rediriger vers la nouvelle URL et l’appelle.

Si vous souhaitez simplement appeler la vue à partir de votre code, il vous suffit de le faire directement - vous n'avez pas besoin d'utiliser l'inverse.

Cela dit, si tout ce que vous voulez faire est de stocker les données, mettez-les simplement dans la session:

request.session['temp_data'] = form.cleaned_data
57
Daniel Roseman

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)
    # ...
43
roach