Настроювання дисплея Django "xxxxxx Object" у бічній панелі дії адміністратора


110

Я хотів би змінити поведінку за замовчуванням того, як адміністратор останніх змін бічній панелі відображає назву доданих "об'єктів". Дивіться на малюнок нижче:

У модулі останніх дій він також показує нові об'єкти як "об'єкт MyModelName"

Я хотів би змінити, як вони названі в адміністраторі. В ідеалі я хотів би мати можливість змінити його з "об’єкта MyModelName" на, як у прикладі об'єкта "Політика", на зразок "Політика: {{значення поля" Назва політики ".}}.

Я думав, що __unicode__для моєї моделі «Пацієнт» це вирішили, але це не здається. Будь-яка допомога вдячна.


1
__unicode__робить це. Вставте свій код, щоб ми могли побачити, що не так
dan-klasson

__unicode__не працював для мене в Python 3. Однак, __str__працював так, як це зафіксовано у відповіді нижче
Dan King

Відповіді:


168

__unicode__робить це. Ваша модель повинна виглядати приблизно так:

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

На Python 3 потрібно використовувати __str__:

def __str__(self):
   return 'Policy: ' + self.name

1
Я нерозумно не помічав, що я оголосив методи unicode для кожної моделі, крім цієї. : doh: Вибачте всіх.
патрік

29

Використання __str__методу працює на Python3 та Django1.8:

class MyModel(models.Model):

    name = models.CharField(max_length=60)

    def __str__(self):
        return 'MyModel: {}'.format(self.name)

3
Це вирішило і для мене. Я також використовую Python3 та Django1.8.
Теодор Скорпан

str - це старий спосіб ..... але python 3 з Django, новий спосіб ( unicode ) не працює?
користувач798719

13

Рядок, який ви бачите, походить від __unicode__методу, як згадували інші. Але справа в тому, що адміністратор зберігає рядкове представлення об'єкта під час створення події журналу, тому якщо ви додасте __unicode__реалізацію після збереження запису журналу, ви не побачите нових заголовків на старих елементах, лише після того, як зробите деяку нову діяльність


Мені було просто цікаво, чому журнал Action не відображає імена після того, як я встановив unicode - я повинен знати, що це просто журнал, що зберігається в db, приймаючи дані на момент створення!
markwalker_

2
спасибі, ви б дали мені великих клопотів, якби ви цього не пояснили
dtc

7

Згадані відповіді __str__та __unicode__методи правильні. Як зазначено в документах, однак, оскільки версію 1.6 (я думаю), ви можете використовувати python_2_unicode_compatibleдекоратор як для Python 2, так і для Python 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"

Ви також можете використовувати вищезазначене і в не Modelоб’єктах.


3

Вам потрібно визначити, який стовпець ви хочете відобразити ...

наприклад:

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

2

Ти маєш рацію, думаючи, що __unicode__це робить. У мене це зараз працює:

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

Переглядаючи список останніх дій, я бачу назву фільму, який я щойно відредагував.


2

Це буде працювати, використовуючи def str (self): який повертає self.title

Використовуйте щось на кшталт:

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

1

Оскільки цьому питанню 6 років, багато чого змінилося. Дозвольте мені оновити його. З python3.6 та останньою версією Django (2.1.2) ви завжди повинні використовувати __str__()в новому коді. __unicode__()це стара історія для python2.7, оскільки в python3, strє unicode.


0

Додавши __str__()метод до моделі Patientтаким чином:

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

відображатиметься ім'я пацієнта замість об'єкта. Для детальної перевірки тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.