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!
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)
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)
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)
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
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' }
)