pasar - Django: ¿Cómo anulo las URL proporcionadas por la aplicación en mi proyecto urlconf?
pasar parametros por url django (2)
Al parecer, las URL duplicadas se permiten en el urlconf, y la primera coincidencia enumerada tendrá prioridad:
urlpatterns = patterns('''',
(r''^$'', include(''glue.urls'')),
(r''^foo/'', include(''foo.urls'')),
# This will override the same URL in bar''s urlconf:
(r''^bar/stuff/$'', ''glue.views.new_bar_stuff'', {''arg'': ''yarrgh''}, ''bar_stuff''),
(r''^bar/'', include(''bar.urls'')),
)
Digamos que tengo un proyecto Django con tres aplicaciones: foo, bar y pegamento. Estoy tratando de seguir las convenciones de las aplicaciones reutilizables, por lo que foo y bar no dependen (y no saben nada) de los demás o del pegamento. Glue contiene código para integrar las otras dos aplicaciones en el sitio.
Foo suministra una etiqueta de plantilla que deseo incluir en una de las páginas que se incluyen en la barra. La vista para la página de la barra se puede pasar una plantilla alternativa. Hago una plantilla con pegamento que extiende la plantilla de la barra e incluye la etiqueta de la plantilla de foo. Para pasar mi nueva plantilla a la vista de barra, necesito modificar la entrada urlconf que apunta a ella.
Mi proyecto urlconf se ve algo como esto:
urlpatterns = patterns('''',
(r''^$'', include(''glue.urls'')),
(r''^foo/'', include(''foo.urls'')),
(r''^bar/'', include(''bar.urls'')),
)
¿Cuál es la forma más elegante de pasar la plantilla alternativa (o cualquier otro argumento de vista arbitrario, en este caso) a la vista en barra? No quiero modificar la urlconf de la barra directamente, ya que eso haría que dependiera del pegamento.
El único otro método en el que puedo pensar es eliminar include(''bar.urls'')
, copiar los patrones de url en urlconf de bar en el proyecto urlconf y modificar el patrón que me interesa. Sin embargo, este enfoque viola el principio DRY. ¿Hay alguna otra solución que me falta?
No está claro lo que está preguntando, pero como lo entiendo, su pregunta es:
¿Cuál es la forma más elegante de pasar la plantilla alternativa a la vista en la barra?
Esto no tiene nada que ver con la url conf, que simplemente asigna las URL a los métodos.
Las plantillas en django se buscan desde las ubicaciones en TEMPLATE_DIRS
en su settings.py, y lo más importante es que django dejará de buscar una vez que encuentre una plantilla .
Si su TEMPLATE_DIRS
está en blanco (como es el valor predeterminado), django buscará plantillas en un directorio de templates
dentro de cualquier aplicación registrada (aplicaciones enumeradas en INSTALLED_APPS
).
Por lo tanto, para pasar una plantilla alternativa a cualquier aplicación, simplemente cree un archivo con el mismo nombre (y estructura de directorio) en un directorio que esté listado en TEMPLATE_DIRS
. Django buscará esto primero y se detendrá cuando encuentre una coincidencia.
Esta es la misma forma en que reemplaza las plantillas de administración predeterminadas.
Para su caso particular, suponga que desea pasar una versión alternativa de index.html
a la bar
la aplicación.
Cree un directorio override_templates
en algún lugar de la ruta de su proyecto.
Dentro de ese directorio, cree la bar/templates/
, y agregue su index.html
personalizado a este directorio, de modo que tenga override_templates/bar/templates/index.html
.
Agregue la ruta completa a override_templates
a TEMPLATE_DIRS
en settings.py
.
Ahora django primero buscará en su directorio personalizado las plantillas solicitadas y cargará su index.html alternativo.