tag - which option does django templates accept
lista de cambios mostrar enlace en el administrador de Django (5)
Estoy intentando cambiar el enlace de un objeto en la pantalla de la lista de administradores de django. Aquí está lo que tengo hasta ahora:
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 de la lista original.
<a href="/admin/app/model/pk/"><a href="/foos/foo/">Foo</a></a>
Creo que la forma correcta de hacerlo es subclasificar la lista de cambios y anular el método url_for_result para crear la url de cambio correcta que desee.
Reemplace el get_changelist en la subclase admin.ModelAdmin para devolver 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
Debe anular la plantilla ya que el enlace está envuelto allí. Echa un vistazo a Editar la plantilla de administrador de usuario de Django .
Después de seguir esta idea yo mismo (para vincular desde la visualización de la lista a la página actual) tuve dudas. Hay dos páginas que debe considerar: la página de administración del modelo y la página pública real (probablemente vista detallada) del modelo. Si vinculas desde el administrador a la página pública (incluso si es una página de CMS) pierdes la conexión a su página de administrador.
La página de administración del modelo en realidad enlaza con la página pública a través del enlace "Vista previa" (que se encuentra en la parte superior derecha). Este enlace deriva de model_object.get_absolute_url()
.
Por lo tanto, si desea cambiar los puntos de enlace de la vista previa, simplemente deberá anular get_absolute_url()
. Y en este caso, probablemente sea bueno que hagas eso, de todos modos, porque es probable que también quieras usar esa URL en todos los demás lugares.
La solución fue anular el inicio y establecer los list_display_links en Ninguno, por ejemplo
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, )
Por defecto, la primera opción de visualización de la lista estará vinculada a la pantalla de edición. Si desea que otra columna o columnas sean ese enlace, una manera muy fácil es la 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, debería ser un llamable como el 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"