Django "xxxxxx Object" zeigt die Anpassung in der Seitenleiste der Administratoraktion an

110

Ich möchte das Standardverhalten ändern, wie in der Seitenleiste der letzten Änderungen des Administrators der Name der hinzugefügten "Objekte" angezeigt wird. Siehe Bild unten:

Im Modul "Letzte Aktionen" werden auch neue Objekte als "MyModelName-Objekt" angezeigt.

Ich möchte ändern, wie diese im Admin benannt werden. Im Idealfall möchte ich es von "MyModelName-Objekt" in "Richtlinie: {{Wert des Felds" Richtlinienname "der Richtlinie.}} Ändern können, wie im Objektbeispiel" Richtlinie ".

Ich dachte, dass __unicode__mein Patientenmodell dies handhabte, aber es scheint nicht so. Jede Unterstützung wird geschätzt.

Patrickn
quelle
1
__unicode__macht das Fügen Sie Ihren Code ein, damit wir sehen können, was los ist
dan-klasson
__unicode__funktionierte nicht für mich in Python 3. Funktionierte jedoch __str__wie in der Antwort unten dokumentiert
Dan King

Antworten:

168

__unicode__macht das Ihr Modell sollte ungefähr so ​​aussehen:

class SomeModel(models.Model):
    def __unicode__(self):
       return 'Policy: ' + self.name

Unter Python 3 müssen Sie Folgendes verwenden __str__:

def __str__(self):
   return 'Policy: ' + self.name
dan-klasson
quelle
1
Ich habe dummerweise nicht bemerkt, dass ich Unicode-Methoden für jedes Modell außer diesem deklariert hatte. : doh: Sorry alle.
Patrickn
29

Die Verwendung der __str__Methode funktioniert unter Python3 und Django1.8:

class MyModel(models.Model):

    name = models.CharField(max_length=60)

    def __str__(self):
        return 'MyModel: {}'.format(self.name)
Aditya Kresna Permana
quelle
3
Das hat sich auch für mich gelöst. Ich benutze auch Python3 und Django1.8.
Teodor Scorpan
str ist der alte Weg ..... doch Python 3 mit Django, der neue Weg ( Unicode ) funktioniert nicht?
user798719
13

Die Zeichenfolge, die Sie sehen, stammt von der __unicode__Methode, wie andere bereits erwähnt haben. Die Sache ist jedoch, dass der Administrator beim Erstellen eines Protokollereignisses die Zeichenfolgendarstellung eines Objekts speichert. Wenn Sie also __unicode__nach dem Speichern des Protokolleintrags eine Implementierung hinzufügen , werden neue Titel für alte Elemente erst angezeigt, nachdem Sie eine neue Aktivität ausgeführt haben

Dmitry Shevchenko
quelle
Ich habe mich nur gefragt, warum das Aktionsprotokoll die Namen nicht anzeigt, nachdem ich Unicode festgelegt habe. Ich hätte wissen müssen, dass es sich nur um ein Protokoll handelt, das zum Zeitpunkt der Erstellung in der Datenbank gespeichert ist und Daten erfasst.
markwalker_
2
danke, hätte mir einen großen Ärger gemacht, wenn du das nicht erklärt
hättest
7

Die genannten Antworten __str__und __unicode__Methoden sind korrekt. Wie in den Dokumenten angegeben, können Sie jedoch seit Version 1.6 (glaube ich) den python_2_unicode_compatibleDecorator sowohl für Python 2 als auch für Python 3 verwenden:

from __future__ import unicode_literals
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class MyClass(models.Model):
    def __str__(self):
        return "Instance of my class"

Sie können das Obige auch in Nicht- ModelObjekten verwenden.

alxs
quelle
3

Sie müssen definieren, welche Spalte Sie anzeigen möchten ...

beispielsweise:

class POAdmin(admin.ModelAdmin):
    list_display = ('qty', 'cost', 'total')
zho
quelle
2

Sie haben Recht, wenn Sie denken, dass dies der __unicode__Fall ist. Ich habe das gerade laufen:

class Film(models.Model):
    title = models.CharField(max_length=200)
    ...
    def __unicode__(self):
        return self.title

Wenn ich in die Liste der letzten Aktionen schaue, sehe ich den Titel des Films, den ich gerade bearbeitet habe.

Andrew Barrett
quelle
2

Dies würde mit def str (self) funktionieren: das gibt self.title zurück

Verwenden Sie etwas wie:

class Blog(models.Model):
    title = models.CharField(max_length=200)
    def __str__(self):
        return self.title
Vishnu MD
quelle
1

Seit diese Frage 6 Jahre alt ist, haben sich viele Dinge geändert. Lassen Sie mich ein Update vornehmen. Mit Python3.6 und der neuesten Version von Django (2.1.2) sollten Sie immer __str__()neuen Code verwenden. __unicode__()ist eine alte Geschichte für Python2.7, weil in Python3, strist unicode.

cgsdfc
quelle
0

Durch Hinzufügen einer __str__()Methode zum Modell auf folgende PatientWeise:

class Patient(models.Model):
name=models.CharField(max_length=200)
#.........
def __str__(self):
    return self.name

zeigt den Namen des Patienten anstelle des Objekts an. Einzelheiten finden Sie hier

Ishwor Khanal
quelle