Django "xxxxxx Object" display customization in admin action sidebar

DjangoDjango ModelsDjango Admin

Django Problem Overview


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

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.

Django Solutions


Solution 1 - Django

__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

Solution 2 - Django

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)

Solution 3 - Django

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

Solution 4 - Django

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.

Solution 5 - Django

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

Solution 6 - Django

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

for example:

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

Solution 7 - Django

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.

Solution 8 - Django

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

Solution 9 - Django

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionpatricknView Question on Stackoverflow
Solution 1 - Djangodan-klassonView Answer on Stackoverflow
Solution 2 - DjangoAditya Kresna PermanaView Answer on Stackoverflow
Solution 3 - DjangoDmitry ShevchenkoView Answer on Stackoverflow
Solution 4 - DjangoalxsView Answer on Stackoverflow
Solution 5 - DjangoVishnu M. D.View Answer on Stackoverflow
Solution 6 - DjangozhoView Answer on Stackoverflow
Solution 7 - DjangoAndrew BarrettView Answer on Stackoverflow
Solution 8 - DjangoIshwor KhanalView Answer on Stackoverflow
Solution 9 - DjangocgsdfcView Answer on Stackoverflow