2012-02-16 5 views
17

Digamos que tengo un proyecto de Django con tres aplicaciones: foo, barra y pegamento. Intento seguir las convenciones de aplicaciones reutilizables, por lo que foo y bar no dependen de (y no saben nada) entre sí o en el pegamento. El pegamento contiene código para integrar las otras dos aplicaciones en el sitio.Django: ¿Cómo anulo las URL provistas por la aplicación en mi proyecto urlconf?

Foo proporciona una etiqueta de plantilla que quiero incluir en una de las páginas suministradas por la barra. La vista de la página de la barra se puede pasar a una plantilla alternativa. Hago una plantilla en pegamento que extiende la plantilla de barra e incluye la etiqueta de plantilla de foo. Para pasar mi nueva plantilla a la vista de la barra, necesito modificar la entrada urlconf que apunta a ella.

Mi proyecto URLconf es como la siguiente:

urlpatterns = patterns('', 
    (r'^$', include('glue.urls')), 
    (r'^foo/', include('foo.urls')), 
    (r'^bar/', include('bar.urls')), 
) 

Cuál es la forma más elegante para pasar la plantilla alternativa (o cualquier otra vista argumentos arbitrarios, para el caso) a la vista en la barra? No quiero modificar el urlconf de la barra directamente, ya que eso lo haría dependiente del pegamento.

El único otro método que puedo pensar es eliminar include('bar.urls'), copiar los patrones de url en el urlconf de la barra en el proyecto urlconf y modificar el patrón que me interesa. Sin embargo, este enfoque infringe el principio DRY. ¿Hay alguna otra solución que me falta?

Respuesta

23

duplicar Al parecer URLs están permitidos en la URLconf, y el primer partido de la lista tendrán 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')), 
) 
2

No está claro lo que están pidiendo, pero como yo lo entiendo, su pregunta es:

Cuál es la forma más elegante para pasar la plantilla alternativa a la vista en la barra?

Esto no tiene nada que ver con la url conf, que solo asigna las URL a los métodos.

plantillas de Django se buscan desde ubicaciones en TEMPLATE_DIRS en su settings.py, y lo más importante Django dejar de buscar una vez que encuentra una plantilla.

Si su TEMPLATE_DIRS está en blanco (que es el valor predeterminado), entonces Django buscará plantillas en un directorio templates dentro de ninguna de las aplicaciones (apps registrados enumerados 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 se enumera en TEMPLATE_DIRS. Django buscará esto primero, y se detendrá cuando encuentre una coincidencia.

Esta es la misma manera que anula las plantillas de administrador predeterminadas.

Para su caso particular, suponga que quiere pasar una versión alternativa de index.html a la aplicación bar.

Cree un directorio override_templates en algún lugar de la ruta de su proyecto.

En el interior que crean el directorio bar/templates/, y agregue su index.html personalizado a este directorio, por lo que tiene override_templates/bar/templates/index.html.

Agregue la ruta completa a override_templates a TEMPLATE_DIRS en settings.py.

Ahora django buscará primero en su directorio personalizado las plantillas solicitadas y cargará su index.html alternativo.

+2

Voy a mirar en este enfoque, pero no es exactamente lo que estoy buscando. ¿Qué pasaría si quisiera pasar algún otro argumento a la vista? La vista se llama en el urlconf, por lo que parece el lugar lógico para pasar el argumento. –

+0

¿Desea pasar argumentos arbitrarios a la vista? Aclara tu pregunta por favor –

+1

Sí, similar a los argumentos que pasaría a una vista genérica desde el urlconf. –

Cuestiones relacionadas