Personalización de visualización de "Objeto xxxxxx" de Django en la barra lateral de acciones de administrador

110

Me gustaría cambiar el comportamiento predeterminado de cómo la barra lateral de cambios recientes del administrador muestra el nombre de los "objetos" agregados. Consulte la siguiente imagen:

En el módulo de acciones recientes, también muestra nuevos objetos como "Objeto MyModelName"

Me gustaría cambiar la forma en que se nombran en el Administrador. Idealmente, me gustaría poder cambiarlo de "objeto MyModelName" a, como en el ejemplo del objeto "Política", algo como "Política: {{valor del campo" Nombre de política "de la política.}}.

Estaba pensando que __unicode__mi modelo Paciente manejó esto, pero parece que no. Se agradece cualquier ayuda.

patrickn
fuente
1
__unicode__hace eso. Pegue su código para que podamos ver qué está mal
dan-klasson
__unicode__no funcionó para mí en Python 3. Sin embargo, __str__funcionó como se documenta en la respuesta a continuación
Dan King

Respuestas:

168

__unicode__hace eso. Tu modelo debería verse así:

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

En Python 3 necesitas usar __str__:

def __str__(self):
   return 'Policy: ' + self.name
dan-klasson
fuente
1
Tontamente no me di cuenta de que había declarado métodos Unicode para cada modelo EXCEPTO este. : doh: Lo siento todo.
patrickn
29

El uso del __str__método funciona en Python3 y Django1.8:

class MyModel(models.Model):

    name = models.CharField(max_length=60)

    def __str__(self):
        return 'MyModel: {}'.format(self.name)
Aditya Kresna Permana
fuente
3
Esto también me resolvió. También uso Python3 y Django1.8.
Teodor Scorpan
str es la forma antigua ..... pero python 3 con Django, la nueva forma ( unicode ) no funciona?
user798719
13

La cadena que está viendo proviene del __unicode__método, como otros han mencionado. Pero la cuestión es que el administrador guarda la representación de cadena de un objeto cuando crea un evento de registro, por lo tanto, si agrega la __unicode__implementación después de que se guardó la entrada del registro, no verá nuevos títulos en elementos antiguos, solo después de realizar una nueva actividad

Dmitry Shevchenko
fuente
Me preguntaba por qué el registro de acciones no mostraba los nombres después de configurar unicode ; ¡debería haber sabido que era solo un registro almacenado en la base de datos que toma datos en el momento de la creación!
markwalker_
2
gracias, me habría dado una gran molestia si no me hubiera explicado eso
dtc
7

Las respuestas que mencionan __str__y los __unicode__métodos son correctos. Sin embargo, como se indica en los documentos , desde la versión 1.6 (creo), puede usar el python_2_unicode_compatibledecorador tanto para Python 2 como para 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"

También puede usar lo anterior en no Modelobjetos.

alxs
fuente
3

Debe definir qué columna desea mostrar ...

por ejemplo:

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

Tienes razón al pensar que eso __unicode__hace eso. Tengo esto funcionando ahora mismo:

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

Cuando miro en la lista de acciones recientes, veo el título de la película que acabo de editar.

Andrew Barrett
fuente
2

Esto funcionaría, usando def str (self): que devuelve self.title

Usa algo como:

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

Dado que esta pregunta tiene 6 años, muchas cosas han cambiado. Permítanme hacer una actualización con python3.6 y la última versión de Django (2.1.2) que siempre debe usar __str__()en el código nuevo. __unicode__()es una vieja historia para python2.7 porque en python3, stres unicode.

cgsdfc
fuente
0

Al agregar un __str__()método al modelo de Patientesta manera:

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

mostrará el nombre del paciente en lugar del objeto. Para obtener más detalles, consulte aquí

Ishwor Khanal
fuente