2011-01-25 6 views
20

A (no tan) pregunta rápida sobre la ampliación de las plantillas de administración de Django.plantillas de administración de Django - alteración de la lista de cambios

Estoy tratando de cambiar la lista de resultados (cambiar la lista en django lingo) de un modelo específico al agregar una fila intermedia entre las filas de resultados (fila1 y fila2 clases) que contiene algunos objetos relacionados con ese objeto.

me buscó en el código, pero no han encontrado una manera de hacer esto. Cualquier puntero es muy apreciado. El código también ayudará.

PD: Sé que debería ser el diseño mi propia interfaz, pero este es un proyecto interno y no tengo mucho tiempo de sobra. Además, la interfaz django es realmente agradable.

Gracias de antemano.

+1

Existen algunas funciones para admin.py que le ayudan a anular los métodos regulares ... [Consulte aquí] (http://docs.djangoproject.com/en/dev/ref/contrib/admin/ # other-methods) ... Pueden ayudarte ... – FallenAngel

Respuesta

27

Paso 1: Anulación de vista de lista de cambios:
Usted tendrá que reemplazar una plantilla en lugar de especificar una como puedas con add_view/change_view.

Primero lo más importante, anule def changelist_view(self, request, extra_context=None): en su ModelAdmin. Recuerde llamar al super(foo, self).changelist_view(request, extra_context) y devolverlo.

Paso 2: Sustituyendo plantillas:
A continuación, anule la plantilla de lista de cambios aplicación específica en templates/admin/my_app/my_model/change_list.html (o no .. se puede utilizar una lista de cambios de anulación mundial también si desea).

Paso 3: Copiar lista de resultados funcionalidad
creo que se puede copiar result_list funcionalidad (definir una nueva etiqueta de plantilla) o falso que al copiar y pegar la función result_list y la plantilla de incluir en su vista.

# django.contrib.admin.templatetags.admin_list 
def result_list(cl): 
    """ 
    Displays the headers and data list together 
    """ 
    return {'cl': cl, 
      'result_hidden_fields': list(result_hidden_fields(cl)), 
      'result_headers': list(result_headers(cl)), 
      'results': list(results(cl))} 
result_list = register.inclusion_tag("admin/change_list_results.html")(result_list) 

Se puede ver que el administrador utiliza esta plantilla para hacer admin/change_list_results.html columnas individuales por lo que tendrá que utilizar uno de los métodos para reemplazar esta etiqueta plantilla.

Ya que está en busca de una plantilla global, no me anularlo.

Cualquiera de definir una nueva etiqueta w/nueva plantilla específicamente para su vista o enviar result_list(cl) a la plantilla directamente y adoptar la admin/change_list_results.html para su uso directamente en la plantilla de change_list.html.

+1

Esto funcionó como un amuleto. Tuve que depurar los atributos de cl en result_list (cl) un poco. Aparte de eso, ¡muchas gracias! :-) – Weholt

30

Para ampliar la respuesta de Yuji, aquí están algunos detalles sobre la sustitución change_list_results.html ...


Anulación changelist_view como se describe anteriormente en el paso 1, y también describió here at djangoproject. O auto-override mediante la colocación en el directorio apropiado como en el paso 2 anterior. (Tenga en cuenta que la ruta de paso 2 se muestra arriba es-modelo específico. App-específico sería /admin/<MyAppName>/change_list.html bajo cualquier directorio definido en la tupla TEMPLATE_DIRS.)

O (quizás más fácil) basta con especificar ModelAdmin.change_list_template como se explica here con cualquier nombre de archivo de plantilla de detección. (Aunque, si no conserva el nombre change_list.html, asegúrese de no depositar directamente en la carpeta /admin, de lo contrario la etiqueta extends causará una recursividad.)

class MyModelAdmin(admin.ModelAdmin): 
    change_list_template = 'change_list.html' # definitely not 'admin/change_list.html' 
    # ... 

En su plantilla change_list.html, tener como mínimo

{% extends "admin/change_list.html" %} 
{% load i18n admin_static admin_list %} 
{% load myapptags %} 

{% block result_list %} 
    {% if action_form and actions_on_top and cl.full_result_count %}{% admin_actions %}{% endif %} 
    {% result_list cl %} 
    {% if action_form and actions_on_bottom and cl.full_result_count %}{% admin_actions %}{% endif %} 
{% endblock %} 

crear un paquete /<MyAppName>/templatetags (un directorio que contiene __init__.py) Con un archivo correspondiente a la etiqueta de carga por encima de

# MyAppName/templatetags/myapptags.py 

from django import template 
from django.contrib.admin.templatetags.admin_list import result_list 

register = template.Library() 
register.inclusion_tag('my_change_list_results.html')(result_list) 

copiar y editar Django de change_list_results.html (como por ejemplo, my_change_list_results.html arriba) para usar su funcionalidad agregada.

Tenga en cuenta que estos pasos no incluyen contexto adicional para la plantilla, pero se pueden ampliar fácilmente como tales. (Mi razón para hacer esto era agregar clases de CSS y un líder <tbody> que no se solucionó con la lista de resultados.)


ADICIONAL:

Incluir contexto adicional, cambiar su módulo templatetags de la siguiente manera:

# MyAppName/templatetags/myapptags.py 

from django import template 
from django.contrib.admin.templatetags.admin_list import result_list as admin_list_result_list 

def result_list(cl): 
    mycl = {'myextracontext': 'something extra'} 
    mycl.update(foo_extra()) 
    mycl.update(admin_list_result_list(cl)) 
    return mycl 

register = template.Library() 
register.inclusion_tag('my_change_list_results.html')(result_list) 

Entonces, el valor de myextracontext o lo que sea foo_extra retornos pueden ser incluidos en la plantilla de resultados (como por ejemplo {{ myextracontext }})

+0

¡No pude entender la estructura de esta respuesta! – Pranab

Cuestiones relacionadas