Настройка отображения Django «xxxxxx Object» на боковой панели действий администратора

110

Я хотел бы изменить поведение по умолчанию того, как на боковой панели недавних изменений администратора отображается имя добавленных «объектов». См. Картинку ниже:

В модуле недавних действий он также показывает новые объекты как «MyModelName object».

Я хотел бы изменить их название в админке. В идеале я хотел бы иметь возможность изменить его с «MyModelName object» на, как в примере объекта «Policy», на что-то вроде «Policy: {{значение поля« Policy Name »политики.}}.

Я думал, что __unicode__моя модель пациента справилась с этим, но, похоже, это не так. Любая помощь приветствуется.

Патрикн
источник
1
__unicode__делает это. Вставьте свой код, чтобы мы могли увидеть, что не так
dan-klasson
__unicode__не работал у меня в Python 3. Однако __str__работал, как описано в ответе ниже
Дэн Кинг

Ответы:

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: Извините всех.
patrickn
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 ) не работает?
user798719
13

Строка, которую вы видите, исходит из __unicode__метода, как упоминали другие. Но дело в том, что администратор сохраняет строковое представление объекта при создании события журнала, поэтому, если вы добавите __unicode__реализацию после того, как запись журнала была сохранена, вы не увидите новые заголовки в старых элементах, только после того, как вы сделаете новое действие.

Дмитрий Шевченко
источник
Мне просто было интересно, почему в журнале действий не отображаются имена после того, как я установил unicode - я должен был знать, что это просто журнал, хранящийся в базе данных, принимающий данные во время создания!
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объектах.

alxs
источник
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.

cgsdfc
источник
0

Добавив __str__()метод в модель Patientследующим образом:

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

вместо объекта отобразит имя пациента. Подробности здесь

Ишвор Ханал
источник