2011-09-21 17 views

Respuesta

12

Quería la misma funcionalidad para mi sitio y la agregué haciendo pequeñas modificaciones al sistema core django.

Paso 1: Primero necesitamos una forma de indicar qué modelos deben tener sus propiedades en la lista. Agregue el código siguiente para los modelos para los que desea los casos mencionados (en models.py):

class Meta: 
    list_instances = True 

Paso 2: tenemos que modificar Django para reconocer y leer este nuevo atributo. En el archivo de núcleo-django: db/modelos/options.py, más o menos en la línea 22 'de agregación list_instances' a DEFAULT_NAMES:

DEFAULT_NAMES = ('verbose_name', 'verbose_name_plural', 'db_table', 'ordering', 
      'unique_together', 'permissions', 'get_latest_by', 
      'order_with_respect_to', 'app_label', 'db_tablespace', 
      'abstract', 'managed', 'proxy', 'auto_created', 'list_instances') 

y en el mismo archivo, más o menos en la línea 52, cree un campo predeterminado de este atributo justo después de los otros atributos:

self.list_instances = False 

Paso 3: Tenemos que pasar esta información a la plantilla que genera la página de índice. En el archivo de núcleo-django: contrib/admin/sites.py, método index() en el interior y en el interior del "si": has_module_perms parte, añadir el siguiente código:

instances = [] 
if (model._meta.list_instances == True): 
    instances = model_admin.queryset(None) 

Esto creará la lista de instancias para mostrar , pero solo si se establece el atributo list_instance. En el mismo archivo, unas pocas líneas más abajo, añada estos valores al constructo "model_dict".

model_dict = { 
    'name': capfirst(model._meta.verbose_name_plural), 
    'admin_url': mark_safe('%s/%s/' % (app_label, model. __name__.lower())), 
    'perms': perms, 
    'list_instances':model._meta.list_instances, 
    'instances': instances, 
} 

Paso 4: El paso final es para modificar la plantilla para apoyar esto. Edite el archivo core-django /contrib/admin/templates/admin/index.html o copie este archivo en el directorio templates/admin/de su aplicación específica. Agregue algunas líneas después del código estándar para generar filas para generar las "sub-filas" si corresponde. Aproximadamente en la línea 40, justo entre "/ tr>" y "{% endfor%}":

{% if model.list_instances %} 
    {% for instance in model.instances %} 
    <tr> 
     <td colspan="2" style="padding-left: 2em;">{{ instance }}</td> 
     {% if model.perms.change %} 
      <td><a href="{{ model.admin_url }}{{ instance.id }}/" class="changelink">{% trans 'Change' %}</a></td> 
     {% else %} 
      <td>&nbsp;</td> 
     {% endif %} 
    </tr> 
    {% endfor %} 
{% endif %} 

Esto hará que el elemento a la lista con el método nombre generado por el Unicode() de la modelo.

Paso 5: Lo and behold!Debe ser algo como esto:

enter image description here

Editar: Opcional Paso 6: Si desea que los nombres de instancia se pueda hacer clic también, al cambiar la plantilla (index.html) y reemplazar:

<td colspan="2" style="padding-left: 2em;">{{ instance }}</td> 

con:

<td colspan="2" style="padding-left: 2em;">   
    {% if model.perms.change %}    
     <a href="{{ model.admin_url }}{{ instance.id}}">{{ instance }}</a> 
    {% else %} 
     {{ instance }} 
    {% endif %} 
</td> 
+0

buena explicación !! ¡¡Gracias!! – Nava

+1

que había enseñado como un profesor ;-) gracias una vez más. – Nava

+2

No hay problema. :) Lo necesitaba para mí también. Si también lo desea al hacer clic en su aplicación específica, vaya a contrib/admin/sites.py nuevamente y agregue las mismas pocas filas como lo hizo en el método index() al método app_index() también. – Setomidor

1

Puede hacer esto cambiando las diversas plantillas de administración - la raíz se llama app_index.html y controla lo que se muestra allí. La mejor manera de investigar qué está sucediendo es instalar django-debug-toolbar y luego mirar las plantillas que se utilizan para cada vista para descubrir cómo personalizar.

+1

Totalmente correcto ... pero este es un camino largo y oscuro para bajar, lo he intentado antes. El django-admin no fue hecho para ser particularmente modular o extensible. ¿Está seguro de que el usuario no puede simplemente hacer clic en uno de estos enlaces primero? – Dave

0

ACTUALIZACIÓN Se respuesta de tomidor para django 10

Siempre es bueno volver a esta solución limpia!

paso 2 - es alrededor de la línea 125 (era 52)

paso 3 - en sites.py - actualizar el nuevo método -

_build_app_dict 

dentro del bucle: for model, model_admin in models.items():

agregue el paso 3 como se indica alrededor de las líneas 430 y 460

instances = [] 


if (model._meta.list_instances == True): 
    instances = model_admin.get_queryset(None) 
Cuestiones relacionadas