Django "xxxxxx Object" visualizza la personalizzazione nella barra laterale delle azioni di amministrazione


110

Vorrei modificare il comportamento predefinito di come la barra laterale delle modifiche recenti dell'amministratore visualizza il nome degli "oggetti" aggiunti. Fare riferimento all'immagine qui sotto:

Nel modulo delle azioni recenti, mostra anche i nuovi oggetti come "Oggetto MyModelName"

Vorrei cambiare il modo in cui questi vengono denominati in Admin. Idealmente, vorrei essere in grado di cambiarlo da "MyModelName object" a, come nell'esempio dell'oggetto "Policy", qualcosa come "Policy: {{valore del campo" Policy Name "della policy.}}.

Stavo pensando che __unicode__per il mio paziente il modello gestisse questo, ma non sembra. Qualsiasi assistenza è apprezzata.


1
__unicode__lo fa. Incolla il tuo codice così possiamo vedere cosa c'è che non va
dan-klasson

__unicode__non ha funzionato per me in Python 3. Tuttavia, __str__ha funzionato come documentato nella risposta di seguito
Dan King

Risposte:


168

__unicode__lo fa. Il tuo modello dovrebbe assomigliare a questo:

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

Su Python 3 devi usare __str__:

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

1
Stupidamente non ho notato che avevo dichiarato metodi Unicode per ogni modello TRANNE questo. : doh: Scusate tutti.
patrickn

29

L'uso del __str__metodo funziona su Python3 e Django1.8:

class MyModel(models.Model):

    name = models.CharField(max_length=60)

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

3
Questo ha risolto anche per me. Uso anche Python3 e Django1.8.
Teodor Scorpan

str è il vecchio modo ..... eppure python 3 con Django, il nuovo modo ( unicode ) non funziona?
user798719

13

La stringa che stai vedendo proviene dal __unicode__metodo, come altri hanno già detto. Ma il fatto è che l'amministratore salva la rappresentazione di stringa di un oggetto quando crea un evento di log, quindi se aggiungi l' __unicode__implementazione dopo che la voce di log è stata salvata, non vedrai nuovi titoli sui vecchi elementi, solo dopo aver fatto qualche nuova attività


Mi stavo solo chiedendo perché il registro delle azioni non mostrava i nomi dopo aver impostato unicode : avrei dovuto sapere che era solo un registro memorizzato nel db che prendeva i dati al momento della creazione!
Markwalker_

2
grazie, mi avrebbe dato una grande seccatura se non l'avessi spiegato
dtc

7

Le risposte menzionate __str__e i __unicode__metodi sono corretti. Come indicato nella documentazione , tuttavia, dalla versione 1.6 (credo), è possibile utilizzare il python_2_unicode_compatibledecoratore sia per Python 2 che per 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"

Puoi usare quanto sopra anche nei non Modeloggetti.


3

È necessario definire quale colonna si desidera visualizzare ...

per esempio:

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

2

Hai ragione nel pensare che lo __unicode__fa. Ho questo in esecuzione in questo momento:

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

Quando guardo nell'elenco delle azioni recenti, vedo il titolo del film che ho appena modificato.


2

Questo funzionerebbe, usando def str (self): che restituisce self.title

Usa qualcosa come:

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

1

Poiché questa domanda ha 6 anni, molte cose sono cambiate. Lasciami fare un aggiornamento con python3.6 e l'ultima versione di Django (2.1.2) dovresti sempre usare __str__()nel nuovo codice. __unicode__()è una vecchia storia per python2.7 perché in python3 lo strè unicode.


0

Aggiungendo il __str__()metodo al modello in Patientquesto modo:

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

mostrerà il nome del paziente al posto dell'oggetto. Per i dettagli controllare qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.