2010-06-29 9 views
28

Ho una situazione nel mio progetto in cui ho bisogno di fare un reindirizzamento degli utenti a un URL contenente un parametro, (si è dichiarata nel urls.py come:Django tornare HttpResponseRedirect a un URL con un parametro

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

come posso mettere quel parametro nella dichiarazione HttpResponseRedirect ho provato come: ritorno HttpResponseRedirect ('/ aula/notamember/classname'), in ogni caso, questo è sciocco, lo so, non riesco a prendere in considerazione il 'classmane' come . un parametro Per chiarezza, la mia opinione è:

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/') 

come posso includere la variabile 'theclass' in quell'URL? Grazie mille!

risposta

38

Prova questo:

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

EDIT:

Questo è sicuramente migliore (risposta di Daniel Roseman):

from django.core.urlresolvers import reverse 

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

hmmm ... non sembra funzionare - il nome di classe ancora non compare nel URL :( – dana

+0

Cosa appaiono nella URL – adamk

+0

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

47

Questo non dovrebbe essere complicato. L'argomento su HttpResponseRedirect è semplicemente una stringa, quindi le normali regole per la creazione di una stringa si applicano qui. Tuttavia, non penso che tu voglia la variabile theclass, poiché si tratta di un oggetto ClassRoom, non di una stringa. Probabilmente preferisci il classname. adamk ti ha dato la risposta giusta qui.

Tuttavia, avendo detto che è possibile utilizzare solo una stringa, ciò che si dovrebbe fare è utilizzare la funzione reverse. Questo perché in seguito potresti decidere di cambiare la struttura dell'URL e invece di dover cercare nel tuo codice la ricerca di ogni posto in cui hai codificato la stringa dell'URL, dovresti fare affidamento sul fatto di averli definiti in un'unica posizione: i tuoi URL. file py. Così si dovrebbe fare qualcosa di simile:

from django.core.urlresolvers import reverse 

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

interessante! D'ora in poi userò la funzione inversa per gli URL. Grazie! – dana

3

In realtà, la scorciatoia redirect prende nomi di viste e modelli (che ha definito get_absolute_url) nomi troppo.

from django.shortcuts import redirect 

return redirect(leave_classroom) 
Problemi correlati