web-dev-qa-db-fra.com

Django retourne HttpResponseRedirect à une URL avec un paramètre

J'ai une situation dans mon projet où j'ai besoin de faire une redirection de l'utilisateur vers une URL contenant un paramètre, (il est déclaré dans le urls.py comme:

url(r'^notamember/(?P<classname>\w+)/$', 
                           notamember,
                           name='notamember'),)

Comment puis-je mettre ce paramètre dans le retour HttpResponseRedirect? J'ai essayé comme: return HttpResponseRedirect ('/room/notamember/classname'), de toute façon, c'est idiot, je sais, je ne peux pas considérer le 'classmane' comme paramètre. Pour plus de clarté, mon point de vue est le suivant:

def leave_classroom(request,classname):
theclass = Classroom.objects.get(classname = classname)
u = Membership.objects.filter(classroom=theclass).get(member = request.user).delete()
return HttpResponseRedirect('/classroom/notamember/theclass/')

comment puis-je inclure la variable "theclass" dans cette URL? Merci beaucoup!

30
dana

Essaye ça:

return HttpResponseRedirect('/classroom/notamember/%s/' % classname)

MODIFIER:

C'est sûrement mieux (réponse de Daniel Roseman):

from Django.core.urlresolvers import reverse

url = reverse('notamember', kwargs={'classname': classname})
return HttpResponseRedirect(url)
43
adamk

Cela ne devrait pas être compliqué. L'argument de HttpResponseRedirect est simplement une chaîne, donc les règles normales pour construire une chaîne s'appliquent ici. Cependant, je ne pense pas que vous vouliez la variable theclass là-dedans, car c'est un objet ClassRoom, pas une chaîne. Vous voulez probablement le classname à la place. adamk vous a donné la bonne réponse ici.

Cependant, après avoir dit que vous pouvez simplement utiliser une chaîne, ce que vous devez réellement faire est d'utiliser la fonction reverse. C'est parce que vous pourriez décider plus tard de changer la structure de l'URL, et plutôt que d'avoir à parcourir votre code pour trouver chaque endroit où vous avez codé en dur la chaîne d'URL, vous devriez vous fier à les avoir définies en un seul endroit: vos URL. fichier py. Vous devriez donc faire quelque chose comme ceci:

from Django.core.urlresolvers import reverse

url = reverse('notamember', kwargs={'classname': classname})
return HttpResponseRedirect(url)
51
Daniel Roseman

En fait, le raccourci redirect prend les noms de vue et le modèle (qui a get_absolute_url définis) également.

from Django.shortcuts import redirect

return redirect(leave_classroom)
4
Lakshman Prasad

Lorsque tout semble ne pas fonctionner, j'utilise le rendu de retour et vérifie s'il s'agit d'une demande au cas où quelqu'un rafraîchirait la page

if request.POST:
    message = "Thank you."
    return render(request, 'index.html', locals())
return HttpResponseRedirect('/')

Le local () rend le paramètre accessible sur le modèle

0
lilhamad

Si vous soumettez à la même URL, vous pouvez utiliser ce qui suit pour transmettre les paramètres.

 template_name = '/classroom/notamember.html'

return render(
                request,
                self.template_name,
                {'classname': 'classname', 'secondvariable': 'variable' }
            )
0
Haris Np