2011-01-16 10 views
5

Tengo mi mente puesta en la creación dinámica de URL en Django, en función de los nombres almacenados en los objetos de la base de datos. Todas estas páginas deben ser manejadas por la misma vista, pero me gustaría que el objeto de la base de datos se pase a la vista como parámetro cuando se invoca. ¿Es eso posible?Django: ¿Pasar datos para ver desde el despachador de url sin incluir los datos en la url?

Aquí está el código que tengo actualmente:

places = models.Place.objects.all() 
for place in places: 
    name = place.name.lower() 
    urlpatterns += patterns('', 
     url(r'^'+name +'/$', 'misc.views.home', name='places.'+name) 
    ) 

¿Es posible pasar información adicional a la vista, sin añadir más parámetros a la URL? Como las URL son para el directorio raíz, y aún necesito páginas 404 para mostrar en otros valores, no puedo usar un parámetro de cadena. ¿La solución es dejar de intentar agregar las URL a la raíz, o hay otra solución?

Supongo que podría hacer una búsqueda sobre el nombre en sí, ya que todas las URL deben ser únicas de todos modos. ¿Es esa la única otra opción?

Respuesta

18

Por lo general, es una mala idea, ya que consultará la base de datos para cada solicitud, no solo las solicitudes relevantes para ese modelo. Una mejor idea es crear la composición general de la URL y utilizar la misma vista para todos ellos. A continuación, puede recuperar el lugar relevante dentro de la vista, que solo llegará a la base de datos cuando llegue a esa vista específica.

Por ejemplo:

urlpatterns += patterns('', 
    url(r'^places/(?P<name>\w+)/$', 'misc.views.home', name='places.view_place') 
) 

# views.py 
def home(request, name): 
    place = models.Place.objects.get(name__iexact=name) 
    # Do more stuff here 

Sé que esto no es lo que realmente solicitado pero debería ofrecerle mucho menos dolores de cabeza.

+0

Usted plantea un buen punto. ¡Gracias! –

18

Creo que se puede pasar un diccionario a la vista con additional attributes, así:

url(r'^'+name +'/$', 'misc.views.home', {'place' : place}, name='places.'+name) 

y se puede cambiar la vista para esperar que este parámetro.

+0

Eso es lo que pedí, no sabía cómo hacerlo. @Cide planteó un buen punto de que esto requeriría una consulta de base de datos para cada solicitud, así que voy con su respuesta. ¡Gracias! –

+0

No hay problema, me alegro de que hayas encontrado una solución :) –

Cuestiones relacionadas