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.


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

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)

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


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.


3

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

na przykład:

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

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.


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

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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.