128

I would like to change the default behavior of how the admin recent changes sidebar displays the name of "objects" added. Refer to the picture below:

In the recent actions module, it also shows new objects as "MyModelName object"

I would like to change how these are named in the Admin. Ideally, I would like to be able to change it from "MyModelName object" to, as in the "Policy" object example, something like "Policy: {{ value of the policy's "Policy Name" field. }}.

I was thinking that __unicode__ for my Patient model handled this, but it doesn't appear to. Any assistance is appreciated.

patrickn
  • 2,501
  • 4
  • 22
  • 21

9 Answers9

191

__unicode__ does do that. Your model should look something like this:

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

On Python 3 you need to use __str__:

def __str__(self):
   return 'Policy: ' + self.name
dan-klasson
  • 13,734
  • 14
  • 63
  • 101
31

Using the __str__ method works on Python3 and Django1.8:

class MyModel(models.Model):

    name = models.CharField(max_length=60)

    def __str__(self):
        return 'MyModel: {}'.format(self.name)
Rob Bednark
  • 25,981
  • 23
  • 80
  • 125
Aditya Kresna Permana
  • 11,869
  • 8
  • 42
  • 48
14

The string you're seeing is coming from __unicode__ method, as others have mentioned. But the thing is that admin saves string representation of an object when it creates log event, therefore if you add __unicode__ implementation after the log entry was saved, you won't see new titles on old items, only after you make some new activity

Dmitry Shevchenko
  • 31,814
  • 10
  • 56
  • 62
  • I was just wondering why the Actions log wasn't showing up the names after I set __unicode__ - I should of known it was just a log stored in the db taking data at the time of creation! – markwalker_ Sep 11 '12 at 10:45
  • 2
    thank you, would've given me a big hassle if you hadn't explained that – dtc Feb 01 '13 at 01:29
7

The answers mentioning __str__ and __unicode__ methods are correct. As stated in the docs however, since version 1.6 (I think), you can use the python_2_unicode_compatible decorator for both Python 2 and 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"

You can use the above in non-Model objects as well.

alekosot
  • 661
  • 9
  • 19
6

This would work, using def str(self): which returns self.title

Use something like:

class Blog(models.Model):
    title = models.CharField(max_length=200)
    def __str__(self):
        return self.title
cdrrr
  • 1,138
  • 4
  • 13
  • 44
Vishnu M. D.
  • 522
  • 6
  • 7
4

You need to define, which column that you want to display...

for example:

class POAdmin(admin.ModelAdmin):
    list_display = ('qty', 'cost', 'total')
zho
  • 643
  • 1
  • 12
  • 27
2

By adding __str__() method to the model Patient this way:

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

will display name of patient instead object. For detail check here

Ishwor Khanal
  • 1,312
  • 18
  • 30
2

You're right in thinking that __unicode__ does that. I have this running right now:

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

When I look in the recent actions list, I see the title of the film that I have just edited.

Andrew Barrett
  • 19,721
  • 4
  • 47
  • 52
1

Since this question is 6 years old, a lot of things have changed. Let me make an update to it.With python3.6 and the latest version of Django (2.1.2) you should always use __str__() in new code. __unicode__() is an old story for python2.7 because in python3, str is unicode.

cgsdfc
  • 538
  • 4
  • 19