Настройка отображения 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объектах.


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.