Django return HttpResponseRedirect vers une url avec un paramètre

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:

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

Comment puis-je mettre ce paramètre dans la directive return HttpResponseRedirect? J'ai essayé comme: return HttpResponseRedirect ('/classroom/notamember/classname'),de toute façon, c'est stupide, je sais, je ne peux pas considérer le 'classmane' comme un paramètre. Pour plus de clarté, de 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!

28
demandé sur dana 2010-06-29 14:57:01

3 réponses

essaye ceci:

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

EDIT:

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)
39
répondu adamk 2010-06-30 14:19:42

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 voulez le theclass variable y, car c'est une Classe d'objet, pas une chaîne de caractères. Vous voulez sans doute l' 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 de caractères, ce que vous devriez vraiment faire est d'utiliser reverse fonction. C'est parce que vous pourriez plus tard décidez de changer la structure de L'URL, et plutôt que d'avoir à regarder à travers votre code trouver chaque endroit où vous avez codé dur la chaîne D'URL, vous devriez compter sur les avoir définis en un seul endroit: votre urls.py file. Vous devriez donc faire quelque chose comme ceci:

from django.core.urlresolvers import reverse

url = reverse('notamember', kwargs={'classname': classname})
return HttpResponseRedirect(url)
49
répondu Daniel Roseman 2010-06-29 11:32:08

en Fait, le raccourci redirect prend les noms de vue et le modèle (qui a get_absolute_url défini) les noms de trop.

from django.shortcuts import redirect

return redirect(leave_classroom)
3
répondu Lakshman Prasad 2010-06-29 13:31:54