Personnalisation de l'affichage de Django «objet xxxxxx» dans la barre latérale des actions d'administration

110

Je voudrais changer le comportement par défaut de la façon dont la barre latérale des modifications récentes de l'administrateur affiche le nom des "objets" ajoutés. Reportez-vous à l'image ci-dessous:

Dans le module des actions récentes, il affiche également les nouveaux objets comme "objet MyModelName"

Je voudrais changer la façon dont ils sont nommés dans l'administrateur Idéalement, j'aimerais pouvoir le changer de "MyModelName object" en, comme dans l'exemple d'objet "Policy", quelque chose comme "Policy: {{valeur du champ" Policy Name "de la stratégie.}}.

Je pensais que __unicode__pour mon modèle Patient géré cela, mais cela ne semble pas. Toute aide est appréciée.

patrickn
la source
1
__unicode__fait ça. Collez votre code pour que nous puissions voir ce qui ne va pas
dan-klasson
__unicode__n'a pas fonctionné pour moi en Python 3. Cependant, __str__a fonctionné comme documenté dans la réponse ci
Dan King

Réponses:

168

__unicode__fait ça. Votre modèle devrait ressembler à ceci:

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

Sur Python 3, vous devez utiliser __str__:

def __str__(self):
   return 'Policy: ' + self.name
dan-klasson
la source
1
Je n'ai pas remarqué bêtement que j'avais déclaré des méthodes unicode pour chaque modèle SAUF celui-ci. : doh: Désolé tout.
patrickn
29

L'utilisation de la __str__méthode fonctionne sur Python3 et Django1.8:

class MyModel(models.Model):

    name = models.CharField(max_length=60)

    def __str__(self):
        return 'MyModel: {}'.format(self.name)
Aditya Kresna Permana
la source
3
Cela a résolu pour moi aussi. J'utilise également Python3 et Django1.8.
Teodor Scorpan du
str est l'ancienne méthode ..... encore python 3 avec Django, la nouvelle méthode ( unicode ) ne fonctionne pas?
user798719
13

La chaîne que vous voyez provient de __unicode__method, comme d'autres l'ont mentionné. Mais le fait est que l'administrateur enregistre la représentation sous forme de chaîne d'un objet lorsqu'il crée un événement de journal.Par conséquent, si vous ajoutez une __unicode__implémentation après l'enregistrement de l'entrée de journal, vous ne verrez pas de nouveaux titres sur les anciens éléments, seulement après avoir effectué une nouvelle activité

Dmitry Shevchenko
la source
Je me demandais simplement pourquoi le journal des actions n'affichait pas les noms après avoir défini unicode - j'aurais dû savoir que c'était juste un journal stocké dans la base de données prenant des données au moment de la création!
markwalker_
2
merci, m'aurait donné un gros problème si vous ne l'aviez pas expliqué
dtc
7

Les réponses mentionnées __str__et les __unicode__méthodes sont correctes. Comme il est indiqué dans les documents cependant, depuis la version 1.6 (je pense), vous pouvez utiliser le python_2_unicode_compatibledécorateur pour les deux Python 2 et 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"

Vous pouvez également utiliser ce qui précède dans des non- Modelobjets.

alxs
la source
3

Vous devez définir la colonne que vous souhaitez afficher ...

par exemple:

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

Vous avez raison de penser que cela __unicode__fait cela. J'ai ceci en cours d'exécution en ce moment:

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

Quand je regarde dans la liste des actions récentes, je vois le titre du film que je viens de monter.

Andrew Barrett
la source
2

Cela fonctionnerait, en utilisant def str (self): qui renvoie self.title

Utilisez quelque chose comme:

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

Depuis que cette question a 6 ans, beaucoup de choses ont changé. Permettez-moi de faire une mise à jour, avec python3.6 et la dernière version de Django (2.1.2), vous devriez toujours utiliser __str__()dans le nouveau code. __unicode__()est une vieille histoire pour python2.7 car en python3, strc'est unicode.

cgsdfc
la source
0

En ajoutant une __str__()méthode au modèle de Patientcette façon:

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

affichera le nom du patient à la place de l'objet. Pour plus de détails, vérifiez ici

Ishwor Khanal
la source