Ich habe ein Person
Modell mit einer Fremdschlüsselbeziehung Book
, das eine Reihe von Feldern enthält, aber ich bin am meisten besorgt über author
(ein Standard-CharField).
Damit wird gesagt, in meinem PersonAdmin
Modell, würde Ich mag zum Anzeigen book.author
verwenden list_display
:
class PersonAdmin(admin.ModelAdmin):
list_display = ['book.author',]
Ich habe alle offensichtlichen Methoden dafür ausprobiert, aber nichts scheint zu funktionieren.
Irgendwelche Vorschläge?
get_author
, da die Zeichenfolge, die Sie zurückgeben (und die Kurzbeschreibung), tatsächlich darauf verweist? Oder ändern Sie das Argument für das Zeichenfolgenformat inobj.book.reviews
?author = ForeignKey(Author)
im Buchmodell haben und dannlist_display = ('author')
?select_related
ist. dasget_queryset()
desUserAdmin
Willens muss überschrieben werden.Trotz all der großartigen Antworten oben und weil ich neu bei Django war, steckte ich immer noch fest. Hier ist meine Erklärung aus einer sehr neuen Perspektive.
models.py
admin.py (Falscher Weg) - Sie denken, es würde funktionieren, wenn Sie 'model__field' als Referenz verwenden, aber das tut es nicht
admin.py (korrekter Weg) - Auf diese Weise verweisen Sie auf einen Fremdschlüsselnamen auf Django-Weise
Weitere Referenz finden Sie in den Modell Django Link hier
quelle
obj
istBookAdmin
?Wie die anderen ging ich auch mit Callables. Aber sie haben einen Nachteil: Standardmäßig können Sie nicht bei ihnen bestellen. Zum Glück gibt es dafür eine Lösung:
Django> = 1,8
Django <1,8
quelle
def author(self, obj):
Bitte beachten Sie, dass das Hinzufügen der
get_author
Funktion die list_display im Administrator verlangsamen würde, da das Anzeigen jeder Person eine SQL-Abfrage durchführen würde.Um dies zu vermeiden, müssen Sie die
get_queryset
Methode in PersonAdmin ändern, zum Beispiel:quelle
__str__
Route entlang gehen sollte , fügen Sie einfach den Fremdschlüssel zulist_display
undlist_select_related
Gemäß der Dokumentation können Sie nur die
__unicode__
Darstellung eines ForeignKey anzeigen:http://docs.djangoproject.com/de/dev/ref/contrib/admin/#list-display
Scheint seltsam, dass es das
'book__author'
Stilformat nicht unterstützt, das überall in der DB-API verwendet wird.Es stellt sich heraus, dass es für diese Funktion ein Ticket gibt , das als "Nicht reparieren" gekennzeichnet ist.
quelle
Ich habe gerade ein Snippet gepostet, mit dem admin.ModelAdmin die Syntax '__' unterstützt:
http://djangosnippets.org/snippets/2887/
So können Sie tun:
Dies geschieht im Grunde genommen genauso wie in den anderen Antworten beschrieben, es wird jedoch automatisch (1) das Setzen von admin_order_field (2) das Setzen von short_description und (3) das Ändern des Abfragesatzes durchgeführt, um einen Datenbanktreffer für jede Zeile zu vermeiden.
quelle
AttributeError: type object 'BaseModel' has no attribute '__metaclass__'
Sie können in der Listenanzeige alles anzeigen, was Sie möchten, indem Sie einen Callable verwenden. Es würde so aussehen:
quelle
Dies ist bereits akzeptiert, aber wenn es andere Dummies gibt (wie ich), die es nicht sofort aus der derzeit akzeptierten Antwort erhalten haben , hier ein bisschen mehr Details.
Die Modellklasse, auf die verwiesen wird
ForeignKey
, muss eine__unicode__
Methode enthalten, wie hier:Das machte den Unterschied für mich und sollte für das obige Szenario gelten. Dies funktioniert unter Django 1.0.2.
quelle
def __str__(self):
.Wenn Sie viele Beziehungsattributfelder verwenden müssen
list_display
und nicht für jedes eine Funktion (und deren Attribute) erstellen möchten, würde eine schmutzige, aber einfache Lösung dieModelAdmin
Instace-__getattr__
Methode überschreiben und die Callables im laufenden Betrieb erstellen:Als Kern hier
Aufrufbare spezielle Attribute wie
boolean
undshort_description
müssen alsModelAdmin
Attribute definiert werden, z . B.book__author_verbose_name = 'Author name'
undcategory__is_new_boolean = True
.Das aufrufbare
admin_order_field
Attribut wird automatisch definiert.Vergessen Sie nicht, das Attribut list_select_related in Ihrem
ModelAdmin
zu verwenden, damit Django zusätzliche Abfragen vermeidet.quelle
In PyPI ist ein sehr einfach zu verwendendes Paket verfügbar, das genau das erledigt : django-related-admin . Sie können den Code auch in GitHub sehen .
Auf diese Weise möchten Sie Folgendes erreichen:
Beide Links enthalten vollständige Details zur Installation und Verwendung, sodass ich sie hier nicht einfügen werde, falls sie sich ändern.
Nur als Randnotiz: Wenn Sie bereits etwas anderes als verwenden
model.Admin
(z. B. habe ichSimpleHistoryAdmin
stattdessen verwendet), können Sie Folgendes tun :class MyAdmin(SimpleHistoryAdmin, RelatedFieldAdmin)
.quelle
Wenn Sie es in Inline versuchen, werden Sie nur erfolgreich sein, wenn:
in Ihrer Inline:
in Ihrem Modell (MyModel):
quelle
Die Antwort von AlexRobbins hat bei mir funktioniert, außer dass die ersten beiden Zeilen im Modell enthalten sein müssen (vielleicht wurde dies angenommen?) Und sich auf sich selbst beziehen sollten:
Dann funktioniert der Admin-Teil gut.
quelle
Ich bevorzuge das:
quelle