2009-09-12 14 views
15

Al visualizar la lista de cambios de administrador para un modelo, ¿es posible hacer que las columnas que corresponden a las claves externas se vinculen a sus páginas respectivas? Un ejemplo simple es que tengo un objeto Foo que contiene Bar como una clave foránea. Si estoy viendo la lista de cambios administrativos para Foo (y la configuro para que incluya Bar en las columnas display_list), la columna principal se vinculará a la página de edición de la instancia Foo, mientras que la columna Bar enlazará a la página de edición de la instancia Boo. Entiendo que puedo anular la plantilla que se usa, pero tenía curiosidad por saber si había alguna solución que no lo requiriera.Cambiar el enlace de la lista a la página de cambio de clave externa

Respuesta

21

Puede definir un método personalizado para utilizar en la lista de cambios que devuelve el código HTML del enlace.

from django.core.urlresolvers import reverse 

class MyFooAdmin(admin.ModelAdmin): 
    list_display = ('foo', 'bar_link') 

    def bar_link(self, obj): 
     url = reverse('admin:myapp_bar_change', args=(obj.pk,)) 
     return '<a href="%s">Edit Bar</a>' % url 
    bar_link.allow_tags = True 

Uno de los problemas con su pregunta como se ha dicho - si Foo tiene una clave externa a Bar, entonces cada foo enlaces a una sola barra, lo que puede enlazar a la página de edición para ese bar. Sin embargo, cada barra se vincula a múltiples foos, por lo que no tiene sentido pedir un enlace a 'la página de edición de la instancia de Foo'. Lo que puede hacer es un enlace a la página de lista de cambios de Foo con el conjunto de filtros para mostrar sólo los casos que tienen enlaces a Bar:

def foo_link(self, obj): 
     url = reverse('admin:myapp_foo_changelist') 
     return '<a href="%s?bar=%s">See Foos</a>' % (url, obj.pk) 
    foo_link.allow_tags = True 
+0

Voy a intentarlo. Lo que quise decir al vincular a la página de cambios de Foo es solo mantener el enlace predeterminado a la página de cambios de Foo de la lista de cambios de Foo (admito que no fui muy claro con eso). – Adam

+2

Cualquier actualización sobre esto en 1.4 o 1.5 (me refiero a que esto parece una gran adición a Django en sí, así que tal vez ya se haya agregado a 'contrib.admin')? –

1

que encontré y le gusta la respuesta de Daniel, aunque la variante de lista de cambios pone fin a cualquier cambio que ya he hecho. Así que esta es una manera de arreglar eso:

primer lugar usted necesita para obtener una referencia a la solicitud, se puede hacer que envolviendo changelist_view o queryset como lo hice:

class CountryAdmin(ModelAdmin): 
    model = Country 
    list_display = ('pk', 'continent_changelist') 

    # ... 

    def queryset(self, request): 
     self._get_params = request.GET 
     return super(CountryAdmin, self).queryset(request) 

    def continent_changelist(self, obj): 
     url = reverse('admin:yourapp_country_changelist') 
     querystring = self._get_params.copy() 
     querystring['continent__id__exact'] = obj.continent.pk 
     return u'<a href="{0}?{1}">{2}</a>'.format(
      url, querystring.urlencode(), obj.continent) 
    continent_changelist.allow_tags = True 

Eso le dará un filtro dentro de las filas de la lista de cambios. Respondí esto en otra pregunta, pero este era el lugar en el que realmente estaba primero, así que quería registrarlo aquí. :-)

Cuestiones relacionadas