¿Cómo anulo una plantilla de administrador (por ejemplo, admin / index.html) y al mismo tiempo la extiendo (consulte https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-replacing -an-admin-template )?
Primero: sé que esta pregunta ya se ha hecho y respondido antes (consulte Django: Anulación y extensión de una plantilla de aplicación ), pero como dice la respuesta, no es directamente aplicable si está utilizando el cargador de plantillas app_directories (que es la mayor parte de hora).
Mi solución actual es hacer copias y extenderlas desde ellas en lugar de extenderlas directamente desde las plantillas de administración. Esto funciona muy bien, pero es realmente confuso y agrega trabajo adicional cuando cambian las plantillas de administrador.
Podría pensar en alguna etiqueta extendida personalizada para las plantillas, pero no quiero reinventar la rueda si ya existe una solución.
En una nota al margen: ¿Alguien sabe si este problema será abordado por Django?
fuente
Respuestas:
Actualización :
Lea los documentos para su versión de Django. p.ej
https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#admin-overriding-templates https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#admin-overriding -plantillas
Respuesta original de 2011:
Tuve el mismo problema hace aproximadamente un año y medio y encontré un buen cargador de plantillas en djangosnippets.org que lo hace fácil. Le permite extender una plantilla en una aplicación específica, brindándole la posibilidad de crear su propia admin / index.html que extiende la plantilla admin / index.html desde la aplicación admin. Me gusta esto:
He dado un ejemplo completo sobre cómo usar este cargador de plantillas en una publicación de blog en mi sitio web.
fuente
django-apptemplates
si algún día puede dejar de funcionar.En cuanto a que Django 1.8 es la versión actual, no hay necesidad de crear enlaces simbólicos, copiar las plantillas / administrador en la carpeta de su proyecto o instalar middlewares como lo sugieren las respuestas anteriores. Esto es lo que hay que hacer:
cree la siguiente estructura de árbol (recomendada por la documentación oficial )
Nota : La ubicación de este archivo no es importante. Puede ponerlo dentro de su aplicación y seguirá funcionando. Mientras django pueda descubrir su ubicación. Lo que es más importante es que el nombre del archivo HTML debe ser el mismo que el nombre del archivo HTML original proporcionado por django.
Agregue esta ruta de plantilla a su settings.py :
Identifique el nombre y el bloque que desea anular. Esto se hace buscando en el directorio admin / templates de django. Estoy usando virtualenv, así que para mí, el camino está aquí:
En este ejemplo, quiero modificar el formulario para agregar un nuevo usuario. La plantilla responsable de esta vista es change_form.html . Abra change_form.html y busque el {% block%} que desea extender.
En su change_form.html , escriba algo como esto:
Carga tu página y deberías ver los cambios
fuente
../
en la ruta "exentos" y especificar la ruta original más única{% extends "../../admin/templates/admin/index.html" %}
. enlace para respondersi necesita sobrescribir el
admin/index.html
, puede establecer el parámetro index_template delAdminSite
.p.ej
y coloca tu plantilla en
<appname>/templates/admin/my_custom_index.html
fuente
{% extends "admin/index.html" %}
desde my_custom_index.html y tener esa referencia en la plantilla de administración de django sin copiarla. Gracias.Con
django
1.5 (al menos) puede definir la plantilla que desea usar para un determinadomodeladmin
ver https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#custom-template-options
Puedes hacer algo como
Con
change_form.html
ser una plantilla html simple que se extiendeadmin/change_form.html
(o no, si quieres hacerlo desde cero)fuente
La respuesta de Chengs es correcta, sin embargo, de acuerdo con los documentos de administración, no todas las plantillas de administración se pueden sobrescribir de esta manera: https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#overriding-admin-templates
Tuve que sobrescribir el login.html del administrador y, por lo tanto, tuve que poner la plantilla sobrescrita en la estructura de esta carpeta:
(sin la subcarpeta myapp en el administrador) No tengo suficiente repulsión para comentar la publicación de Cheng, es por eso que tuve que escribir esto como una nueva respuesta.
fuente
La mejor manera de hacerlo es poner las plantillas de administración de Django dentro de su proyecto. Por lo tanto, sus plantillas estarán disponibles
templates/admin
mientras que las plantillas de administración de Django de stock estarán disponibles, por ejemplotemplate/django_admin
. Luego, puede hacer algo como lo siguiente:templates / admin / change_form.html
Si le preocupa mantener actualizadas las plantillas de stock, puede incluirlas con svn externos o similares.
fuente
--ignore
argumento conmakemessages
. Ver: docs.djangoproject.com/en/dev/ref/django-admin/#makemessagesNo pude encontrar una sola respuesta o una sección en los documentos oficiales de Django que tuviera toda la información que necesitaba para anular / extender las plantillas de administración predeterminadas, así que escribo esta respuesta como una guía completa, con la esperanza de que sea útil para otros en el futuro.
Asumiendo la estructura estándar del proyecto Django:
Esto es lo que debes hacer:
En
mysite/admin.py
, cree una subclase deAdminSite
:Asegúrese de importar
custom_admin_site
enadmin.py
sus aplicaciones y registre sus modelos para mostrarlas en su sitio de administración personalizado (si lo desea).En
mysite/apps.py
, crear una sub-clase deAdminConfig
y conjuntodefault_site
aadmin.CustomAdminSite
partir de la etapa anterior:En
mysite/settings.py
, vuelva a colocardjango.admin.site
enINSTALLED_APPS
laapps.CustomAdminConfig
(el administrador de configuración personalizada aplicación del paso anterior).En
mysite/urls.py
, reemplaceadmin.site.urls
de la URL del administrador acustom_admin_site.urls
Cree la plantilla que desea modificar en su
templates
directorio, manteniendo la estructura predeterminada del directorio de plantillas de administración de Django como se especifica en los documentos . Por ejemplo, si estaba modificandoadmin/index.html
, cree el archivotemplates/admin/index.html
.Todas las plantillas existentes se pueden modificar de esta manera, y sus nombres y estructuras se pueden encontrar en el código fuente de Django .
Ahora puede anular la plantilla escribiéndola desde cero o extenderla y luego anular / extender bloques específicos.
Por ejemplo, si desea mantener todo tal como está pero desea anular el
content
bloqueo (que en la página de índice enumera las aplicaciones y sus modelos que registró), agregue lo siguiente atemplates/admin/index.html
:Para preservar el contenido original de un bloque, agregue
{{ block.super }}
donde quiera que se muestre el contenido original:También puede agregar estilos y scripts personalizados modificando los bloques
extrastyle
yextrahead
.fuente
Estoy de acuerdo con Chris Pratt. Pero creo que es mejor crear el enlace simbólico a la carpeta Django original donde se ubican las plantillas de administración:
y como puede ver, depende de la versión de python y de la carpeta donde instaló Django. Entonces, en el futuro o en un servidor de producción, es posible que deba cambiar la ruta.
fuente
Esta sitio tenía una solución simple que funcionaba con mi configuración de Django 1.7.
PRIMERO: Haga un enlace simbólico llamado admin_src en la plantilla / directorio de su proyecto a sus plantillas Django instaladas. Para mí en Dreamhost usando un virtualenv, mis plantillas de administración de Django "fuente" estaban en:
SEGUNDO: Crear un directorio de administrador en plantillas /
Entonces la plantilla / directorio de mi proyecto ahora se veía así:
TERCERO: en su nuevo directorio template / admin / cree un archivo base.html con este contenido:
CUARTO: Agregue su administrador favicon-admin.ico a su carpeta img raíz estática.
Hecho. Fácil.
fuente
para el índice de la aplicación, agregue esta línea a un archivo py común como url.py
para el índice del módulo de la aplicación: agregue esta línea a admin.py
para la lista de cambios: agregue esta línea a la clase admin:
para plantilla de formulario de módulo de aplicación: agregue esta línea a su clase de administrador
etc. y encuentre otro en las mismas clases de módulos de administrador
fuente
Puede usar django-overextends , que proporciona herencia de plantilla circular para Django.
Proviene del Mezzanine CMS, de donde Stephen lo extrajo en una extensión independiente de Django.
Encontrará más información en "Anulación de plantillas extensibles" (http: /mezzanine.jupo.org/docs/content-architecture.html#overriding-vs-extending-templates) dentro de los documentos Mezzanine.
Para obtener información más profunda, consulte el blog de Stephens "Herencia de plantilla circular para Django" (http: /blog.jupo.org/2012/05/17/circular-template-inheritance-for-django).
Y en Grupos de Google, la discusión (https: /groups.google.com/forum / #! Topic / mezzanine-users / sUydcf_IZkQ) que inició el desarrollo de esta función.
Nota:
No tengo la reputación de agregar más de 2 enlaces. Pero creo que los enlaces proporcionan información de fondo interesante. Así que solo dejé una barra después de "http (s):". Quizás alguien con mejor reputación pueda reparar los enlaces y eliminar esta nota.
fuente