Tengo un modelo Django con una gran cantidad de campos y más de 200 filas de tablas. Para facilitar la URL legibles por humanos y la capacidad de romper la gran lista en sublistas arbitrarias, me gustaría tener una URL que tiene este aspecto:Django: número arbitrario de parámetros urls.py sin nombre
/browse/<name1>/<value1>/<name2>/<value2>/ .... etc ....
donde los mapas 'nombre' a un atributo del modelo y de 'valor' es el criterio de búsqueda para ese atributo. Cada "nombre" se tratará como una categoría para devolver subconjuntos de las instancias del modelo donde coinciden las categorías.
Ahora, esto podría manejarse con parámetros GET, pero prefiero URL más legibles tanto para el usuario como para los motores de búsqueda. Estos subconjuntos de URL se integrarán en cada página que muestre este modelo, por lo que parece que vale la pena el esfuerzo para crear URL bonitas.
Lo ideal sería que cada par nombre/valor se pasa a la función vista como un parámetro llamado name1
, name2
, etc. Sin embargo, no creo que sea posible a los patrones definidos nombrados a través de texto coincidente de una expresión regular. ¿Me equivoco allí?
Por lo tanto, parece que tengo que hacer algo como esto:
urlpatterns = patterns('',
url(r'^browse/(?:([\w]+)/([\w]+)/)+$', 'app.views.view', name="model_browse"),
)
Parece que este debe coincidir con cualquier conjunto de dos pares de nombre/valor. Mientras coincide con éxito, solo pasa el último par de nombre/valor como parámetros a la función de vista. Creo que cada partido está sobrescribiendo el partido anterior. Bajo la suposición de que la contiene (?: ...) + está causando, probé un patrón de repetición simple en su lugar:
urlpatterns = patterns('',
url(r'^browse/([\w]+/)+$', 'app.views.view', name="model_browse"),
)
... y tengo el mismo problema, pero esta vez *args
sólo incluye la última patrón combinado
¿Es esto una limitación del distribuidor de urls de Django, y/o el soporte de expresiones regulares de Python? Parece que cualquiera de estos métodos debería funcionar. ¿Hay alguna forma de lograr esto sin codificar cada atributo de modelo posible en la URL como un patrón opcional (. *)?
creo que implementan "GET consulta como" params de valores clave usando url en sí es un poco feo y no "verdadera". –
@alex: además de que la URL no es legible, es probable que los motores de búsqueda no indexen todo tu contenido si tienes más de un par de parámetros (si es así). –