Personalização de exibição do Django “xxxxxx Object” na barra lateral de ação administrativa

110

Eu gostaria de alterar o comportamento padrão de como a barra lateral de alterações recentes do administrador exibe o nome dos "objetos" adicionados. Consulte a imagem abaixo:

No módulo de ações recentes, ele também mostra novos objetos como "objeto MyModelName"

Eu gostaria de mudar a forma como eles são nomeados no Admin. Idealmente, gostaria de poder alterá-lo de "Objeto MyModelName" para, como no exemplo de objeto "Política", algo como "Política: {{valor do campo" Nome da política "da política.}}.

Eu estava pensando que __unicode__meu modelo de paciente lidou com isso, mas não parece. Qualquer ajuda é apreciada.

patrickn
fonte
1
__unicode__faz isso. Cole seu código para que possamos ver o que há de errado
dan-klasson
__unicode__não funcionou para mim no Python 3. No entanto, __str__funcionou conforme documentado na resposta abaixo
Dan King

Respostas:

168

__unicode__faz isso. Seu modelo deve ser semelhante a este:

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

No Python 3, você precisa usar __str__:

def __str__(self):
   return 'Policy: ' + self.name
dan-klasson
fonte
1
Eu tolamente não percebi que havia declarado métodos Unicode para todos os modelos, EXCETO este. : doh: Desculpe tudo.
patrickn em
29

O uso do __str__método funciona em Python3 e Django1.8:

class MyModel(models.Model):

    name = models.CharField(max_length=60)

    def __str__(self):
        return 'MyModel: {}'.format(self.name)
Aditya Kresna Permana
fonte
3
Isso também resolveu para mim. Eu também uso Python3 e Django1.8.
Teodor Scorpan
str é a maneira antiga ..... ainda python 3 com Django, a nova forma ( unicode ) não funciona?
user798719
13

A string que você está vendo vem do __unicode__método, como outros mencionaram. Mas o fato é que o administrador salva a representação de string de um objeto quando ele cria o evento de registro, portanto, se você adicionar __unicode__implementação depois que a entrada de registro foi salva, você não verá novos títulos em itens antigos, somente depois de fazer alguma nova atividade

Dmitry Shevchenko
fonte
Eu só estava me perguntando por que o log de ações não estava mostrando os nomes depois que configurei o unicode - eu deveria saber que era apenas um log armazenado no banco de dados pegando dados no momento da criação!
markwalker_
2
obrigado, teria me dado um grande aborrecimento se você não tivesse explicado isso
dtc
7

As respostas mencionando __str__e __unicode__métodos estão corretos. Conforme declarado nos docs No entanto, desde a versão 1.6 (eu acho), você pode usar o python_2_unicode_compatibledecorador para ambos Python 2 e 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"

Você pode usar o acima em não Modelobjetos também.

Alxs
fonte
3

Você precisa definir qual coluna deseja exibir ...

por exemplo:

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

Você está certo em pensar que isso __unicode__acontece. Estou com este funcionando agora:

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

Quando olho a lista de ações recentes, vejo o título do filme que acabei de editar.

Andrew Barrett
fonte
2

Isso funcionaria, usando def str (self): que retorna self.title

Use algo como:

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

Como esta pergunta tem 6 anos, muitas coisas mudaram. Deixe-me fazer uma atualização. Com o python3.6 e a versão mais recente do Django (2.1.2), você deve sempre usar __str__()no novo código. __unicode__()é uma história antiga para python2.7 porque em python3, stré unicode.

cgsdfc
fonte
0

Adicionando __str__()método ao modelo Patientdesta forma:

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

exibirá o nome do paciente em vez do objeto. Para detalhes, verifique aqui

Ishwor Khanal
fonte