2010-06-29 10 views
28

J'ai une situation dans mon projet où je dois faire une redirection de l'utilisateur vers une URL contenant un paramètre, (il est déclaré dans le urls.py comme:Django retour HttpResponseRedirect à une URL avec un paramètre

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

Comment puis-je mettre ce paramètre dans le retour HttpResponseRedirect j'ai essayé comme: retour HttpResponseRedirect («/classe/notamember/classname »), de toute façon, cela est stupide, je sais, je ne peux pas considérer le « classmane » comme Pour plus de clarté, mon avis 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!

Répondre

38

Essayez ceci:

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

EDIT:

Ceci est sûrement mieux (la réponse de Daniel Roseman):

from django.core.urlresolvers import reverse 

url = reverse('notamember', kwargs={'classname': classname}) 
return HttpResponseRedirect(url) 
+0

hmmm ... il ne semble pas fonctionner - le nom de classe ne semble toujours pas dans l'url :( – dana

+0

Que apparaît dans l'URL – adamk

+0

http://127.0.0.1:8000/classroom?/notamember/ – dana

47

Cela ne devrait pas être compliqué. L'argument à 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 voulez 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 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 de devoir parcourir votre code pour trouver chaque endroit où vous avez codé en dur la chaîne d'URL, vous devriez les avoir définis en un seul endroit: vos URL. fichier py. Donc, vous devriez faire quelque chose comme ceci:

from django.core.urlresolvers import reverse 

url = reverse('notamember', kwargs={'classname': classname}) 
return HttpResponseRedirect(url) 
+0

intéressant! Je vais utiliser la fonction inverse pour les URL à partir de maintenant. Merci! – dana

3

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

from django.shortcuts import redirect 

return redirect(leave_classroom) 
Questions connexes