Django „Obiekt xxxxxx” dostosowywanie wyświetlania na pasku bocznym akcji administratora

110

Chciałbym zmienić domyślne zachowanie, w jaki sposób panel boczny ostatnich zmian administratora wyświetla nazwę dodanych „obiektów”. Zobacz zdjęcie poniżej:

W module ostatnich działań nowe obiekty są również wyświetlane jako „obiekt MyModelName”

Chciałbym zmienić sposób ich nazywania w panelu administracyjnym. W idealnym przypadku chciałbym móc zmienić to z „MyModelName object” na, jak w przykładzie obiektu „Policy”, coś w rodzaju „Policy: {{wartość pola„ Policy Name ”.}}.

Myślałem, że __unicode__mój model pacjenta sobie z tym poradził, ale wygląda na to, że tak nie jest. Każda pomoc jest mile widziana.

patrickn
źródło
1
__unicode__robi to. Wklej swój kod, abyśmy mogli zobaczyć, co jest nie tak
dan-klasson
__unicode__nie działało dla mnie w Pythonie 3. Jednak __str__działało, jak udokumentowano w odpowiedzi poniżej
Dan King

Odpowiedzi:

168

__unicode__robi to. Twój model powinien wyglądać mniej więcej tak:

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

W Pythonie 3 musisz użyć __str__:

def __str__(self):
   return 'Policy: ' + self.name
dan-klasson
źródło
1
Głupio nie zauważyłem, że zadeklarowałem metody Unicode dla każdego modelu Z WYJĄTKIEM tego. : doh: Przepraszam wszystkich.
patrickn
29

Użycie __str__metody działa na Python3 i Django1.8:

class MyModel(models.Model):

    name = models.CharField(max_length=60)

    def __str__(self):
        return 'MyModel: {}'.format(self.name)
Aditya Kresna Permana
źródło
3
To rozwiązało również dla mnie. Używam też Python3 i Django1.8.
Teodor Scorpan
str to stary sposób ..... jednak python 3 z Django, nowy sposób ( unicode ) nie działa?
user798719
13

Ciąg, który widzisz, pochodzi z __unicode__metody, jak wspominali inni. Ale chodzi o to, że admin zapisuje reprezentację ciągu obiektu podczas tworzenia zdarzenia dziennika, dlatego jeśli dodasz __unicode__implementację po zapisaniu wpisu dziennika, nie zobaczysz nowych tytułów na starych elementach, tylko po wykonaniu nowej czynności

Dmitrij Szewczenko
źródło
Zastanawiałem się tylko, dlaczego dziennik akcji nie wyświetlał nazw po ustawieniu Unicode - powinienem był wiedzieć, że był to tylko dziennik przechowywany w bazie danych, który pobierał dane w momencie tworzenia!
markwalker_
2
dziękuję, sprawiłoby mi duży kłopot, gdybyś tego nie wyjaśnił
dtc,
7

Podane odpowiedzi __str__i __unicode__metody są poprawne. Jak stwierdzono w dokumentacji , od wersji 1.6 (chyba) można używać python_2_unicode_compatibledekoratora zarówno dla Pythona 2, jak i Pythona 3:

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"

Możesz użyć powyższego również w Modelobiektach niebędących obiektami.

alxs
źródło
3

Musisz zdefiniować, którą kolumnę chcesz wyświetlić ...

na przykład:

class POAdmin(admin.ModelAdmin):
    list_display = ('qty', 'cost', 'total')
zho
źródło
2

Masz rację, myśląc, że to __unicode__robi. Mam to uruchomione teraz:

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

Kiedy patrzę na listę ostatnich akcji, widzę tytuł filmu, który właśnie zredagowałem.

Andrew Barrett
źródło
2

To zadziała, używając def str (self):, które zwraca self.title

Użyj czegoś takiego:

class Blog(models.Model):
    title = models.CharField(max_length=200)
    def __str__(self):
        return self.title
Vishnu MD
źródło
1

Ponieważ to pytanie ma już 6 lat, wiele się zmieniło. Pozwólcie, że dokonam aktualizacji. Dzięki python3.6 i najnowszej wersji Django (2.1.2) należy zawsze używać __str__()nowego kodu. __unicode__()to stara historia dla pythona2.7, ponieważ w pythonie3 strjest unicode.

cgsdfc
źródło
0

Dodając __str__()metodę do modelu w Patientten sposób:

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

wyświetli nazwę pacjenta zamiast obiektu. Szczegóły znajdziesz tutaj

Ishwor Khanal
źródło