Tengo un Person
modelo que tiene una relación de clave externa Book
con varios campos, pero me preocupa más author
(un CharField estándar).
Dicho esto, en mi PersonAdmin
modelo, me gustaría mostrar book.author
usando list_display
:
class PersonAdmin(admin.ModelAdmin):
list_display = ['book.author',]
He probado todos los métodos obvios para hacerlo, pero nada parece funcionar.
¿Alguna sugerencia?
get_author
, ya que eso es a lo que realmente hace referencia la cadena que está devolviendo (y la breve descripción)? ¿O cambiar el argumento de formato de cadena aobj.book.reviews
?author = ForeignKey(Author)
el modelo de libro y luegolist_display = ('author')
?select_related
está. laget_queryset()
de laUserAdmin
tendrá que ser sobrescrita.A pesar de todas las excelentes respuestas anteriores y debido a que soy nuevo en Django, todavía estaba atrapado. Aquí está mi explicación desde una perspectiva muy novata.
modelos.py
admin.py (manera incorrecta) : cree que funcionaría usando 'model__field' como referencia, pero no funciona
admin.py (forma correcta) : así es como se hace referencia a un nombre de clave externa de la manera Django
Para referencia adicional, vea el enlace del modelo Django aquí
fuente
obj
esBookAdmin
?Como el resto, también fui con callables. Pero tienen un inconveniente: de forma predeterminada, no puede ordenarlos. Afortunadamente, hay una solución para eso:
Django> = 1.8
Django <1.8
fuente
def author(self, obj):
Tenga en cuenta que agregar la
get_author
función ralentizaría list_display en el administrador, porque mostrar a cada persona haría una consulta SQL.Para evitar esto, debe modificar el
get_queryset
método en PersonAdmin, por ejemplo:fuente
__str__
ruta, simplemente agregue la llave extranjera alist_display
ylist_select_related
De acuerdo con la documentación, solo puede mostrar la
__unicode__
representación de una ForeignKey:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#list-display
Parece extraño que no sea compatible con el
'book__author'
formato de estilo que se usa en todas partes en la API DB.Resulta que hay un boleto para esta función , que está marcado como No soluciona.
fuente
Acabo de publicar un fragmento que hace que admin.ModelAdmin sea compatible con la sintaxis '__':
http://djangosnippets.org/snippets/2887/
Entonces puedes hacer:
Básicamente, esto es lo mismo que se describe en las otras respuestas, pero automáticamente se encarga de (1) establecer admin_order_field (2) establecer short_description y (3) modificar el conjunto de consultas para evitar un acierto en la base de datos para cada fila.
fuente
AttributeError: type object 'BaseModel' has no attribute '__metaclass__'
Puede mostrar lo que quiera en la visualización de la lista utilizando un invocable. Se vería así:
fuente
Este ya ha sido aceptado, pero si hay otras tonterías (como yo) que no lo obtuvieron inmediatamente de la respuesta actualmente aceptada , aquí hay un poco más de detalle.
La clase de modelo referenciada por las
ForeignKey
necesidades debe tener un__unicode__
método dentro de ella, como aquí:Eso marcó la diferencia para mí y debería aplicarse al escenario anterior. Esto funciona en Django 1.0.2.
fuente
def __str__(self):
.Si tiene muchos campos de atributos de relación para usar
list_display
y no desea crear una función (y sus atributos) para cada uno, una solución simple pero simple sería anular el método deModelAdmin
instancia__getattr__
, creando los invocables sobre la marcha:Como lo esencial aquí
Los atributos especiales invocables como
boolean
yshort_description
deben definirse comoModelAdmin
atributos, por ejemplo,book__author_verbose_name = 'Author name'
ycategory__is_new_boolean = True
.El
admin_order_field
atributo invocable se define automáticamente.No olvides usar el atributo list_select_related en tu
ModelAdmin
para hacer que Django evite consultas adicionales.fuente
Hay un paquete muy fácil de usar disponible en PyPI que maneja exactamente eso: django-related-admin . También puedes ver el código en GitHub .
Con esto, lo que quieres lograr es tan simple como:
Ambos enlaces contienen detalles completos de instalación y uso, por lo que no los pegaré aquí en caso de que cambien.
Así como una nota al margen, si usted ya está usando algo distinto
model.Admin
(por ejemplo, yo estaba usandoSimpleHistoryAdmin
en su lugar), se puede hacer esto:class MyAdmin(SimpleHistoryAdmin, RelatedFieldAdmin)
.fuente
Si lo prueba en línea, no tendrá éxito a menos que:
en su línea:
en su modelo (MyModel):
fuente
La respuesta de AlexRobbins funcionó para mí, excepto que las dos primeras líneas deben estar en el modelo (¿tal vez se asumió esto?), Y deberían hacer referencia a sí mismo:
Entonces la parte de administrador funciona bien.
fuente
Prefiero esto:
fuente