2010-10-22 20 views
16

Estoy intentando cambiar el enlace de un objeto en la pantalla de la lista de administración de django. Esto es lo que tengo hasta ahora:cambiar lista mostrar enlace en django admin

class FooModelAdmin(admin.ModelAdmin): 
    fields = ('foo','bar') 
    list_display = ('foo_link','bar') 

    def foo_link(self,obj): 
     return u'<a href="/foos/%s/">%s</a>' % (obj.foo,obj) 
    domain_link.allow_tags = True 
    domain_link.short_description = "foo" 

Esto produce otro enlace dentro del enlace de visualización de la lista original, p.

<a href="/admin/app/model/pk/"><a href="/foos/foo/">Foo</a></a> 

Respuesta

24

La solución fue anular el init y establecer el list_display_links en Ninguno, p.

class FooModelAdmin(admin.ModelAdmin): 
    fields = ('foo','bar') 
    list_display = ('foo_link','bar') 

    def foo_link(self,obj): 
     return u'<a href="/foos/%s/">%s</a>' % (obj.foo,obj) 
    foo_link.allow_tags = True 
    foo_link.short_description = "foo" 
    def __init__(self,*args,**kwargs): 
     super(FooModelAdmin, self).__init__(*args, **kwargs) 
     self.list_display_links = (None,) 
19

Creo que la forma correcta de hacerlo es subclasificar ChangeList y anular el método url_for_result para crear la URL de cambio correcta que desee.

Sustituir el get_changelist en la subclase admin.ModelAdmin para regresar a la nueva clase:

from django.contrib.admin.views.main import ChangeList 
from django.contrib.admin.util import quote 

class FooChangeList(ChangeList): 
    def url_for_result(self, result): 
     pk = getattr(result, self.pk_attname) 
     return '/foos/foo/%d/' % (quote(pk)) 

class FooAdmin(admin.ModelAdmin): 
    def get_changelist(self, request, **kwargs): 
     return FooChangeList 
+6

Esta debe ser la respuesta aceptada. –

0

Después de seguir esta idea a mí mismo (a enlazar desde la pantalla de lista de la página real) que tenía dudas. Hay dos páginas que debe tener en cuenta: la página de administración del modelo y la página pública real (probablemente vista de detalles) del modelo. Si vincula desde la página de administración a la pública (incluso si es una página de CMS), pierde la conexión a su página de administración.

La página de administración del modelo de realidad enlaces a la página pública a través del enlace "Vista previa" (que se encuentra regularmente en la parte superior derecha). Este enlace deriva de model_object.get_absolute_url().

Por lo tanto, si desea cambiar el lugar donde los puntos de enlace de vista previa, simplemente tienes que anulan get_absolute_url(). Y en este caso, probablemente sea bueno que hagas eso, de todos modos, porque es probable que desees utilizar esa url en todos los demás lugares.

0

Por defecto, la primera opción de visualización de lista será el enlace a la pantalla de edición. Si desea otra columna o columnas que ser ese enlace, una manera muy fácil, es el siguiente:

class FooModelAdmin(admin.ModelAdmin): 
    list_display = ('foo_link', 'bar', 'another_bar',) 
    list_display_links = ('foo_link', 'another_bar',) 

Si foo_link no es una propiedad del modelo, debe ser un exigible como la siguiente:

class FooModelAdmin(admin.ModelAdmin): 
    list_display = ('foo_link', 'bar', 'another_bar',) 
    list_display_links = ('foo_link', 'another_bar',) 
    def foo_link(self, obj): 
     return "%s blah blah" % obj.some_property # or anything you prefer e.g. an edit button 

un ejemplo completo de mi proyecto:

class SchoolTeacherAdmin(admin.ModelAdmin): 
    list_display = ('name', 'designation', 'school_name', 'school_code', 'date_of_birth', 'mobile', 'nid', 'edit',) 
    list_display_links = ('edit',) 

    def school_code(self, obj): 
     return obj.school.code 

    def school_name(self, obj): 
     return obj.school.name.upper() 

    def edit(self, obj): 
     return "Edit" 
Cuestiones relacionadas