2010-06-29 16 views
28

Tengo una situación en mi proyecto en el que tengo que hacer un cambio de dirección del usuario a una URL que contiene un parámetro, (que se declara en el urls.py como:Django volver HttpResponseRedirect a una URL con un parámetro

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

cómo puedo poner ese parámetro en el retorno HttpResponseRedirect me trataron como: retorno HttpResponseRedirect ('/ clase/notamember/nombre de clase'), de todos modos, esto es absurdo, lo sé, no puedo considerar el 'classmane' como un parámetro. Para mayor claridad, mi punto de vista es:

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

¿cómo puedo incluir la variable 'theclass' en esa url? ¡Muchas gracias!

Respuesta

38

Prueba esto:

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

EDIT:

Este es sin duda mejor (la respuesta de Daniel Roseman):

from django.core.urlresolvers import reverse 

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

hmmm ... no parece trabajar - el nombre de clase todavía no aparece en la url :( – dana

+0

Lo que sí aparece en la URL – adamk

+0

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

47

Esto no debería ser complicado. El argumento para HttpResponseRedirect es simplemente una cadena, por lo que aquí se aplican las reglas normales para crear una cadena. Sin embargo, no creo que desee la variable theclass, ya que es un objeto ClassRoom, no una cadena. Presumiblemente quiere el classname en su lugar. adamk te ha dado la respuesta correcta aquí.

Sin embargo, una vez dicho esto, puede utilizar una cadena, lo que realmente debe hacer es utilizar la función reverse. Esto se debe a que más tarde puede decidir cambiar la estructura de la URL, y en lugar de tener que buscar en el código para encontrar cada lugar donde ha codificado la cadena de URL, debe confiar en que los ha definido en un solo lugar: sus URL. archivo py Por lo que debe hacer algo como esto:

from django.core.urlresolvers import reverse 

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

¡muy interesante! Voy a utilizar la función inversa para las URL a partir de ahora. ¡Gracias! – dana

3

En realidad, el acceso directo redirect toma nombres de las vistas y el modelo (que se ha definido get_absolute_url) nombres también.

from django.shortcuts import redirect 

return redirect(leave_classroom) 
Cuestiones relacionadas