Django“ xxxxxx对象”在管理操作侧栏中显示自定义


110

我想更改管理员最近更改侧边栏显示添加的“对象”名称的默认行为。请参考下图:

在“最近的操作”模块中,它还将新对象显示为“ MyModelName对象”

我想更改这些在管理员中的命名方式。理想情况下,我希望能够将其从“ MyModelName对象”更改为“ Policy”对象示例中的内容,例如“ Policy:{{策略“ Policy Name”字段的值。}}。

我当时以为__unicode__我的患者模型可以解决此问题,但事实并非如此。任何帮助表示赞赏。


1
__unicode__做到了。粘贴您的代码,以便我们可以找出问题所在
dan-klasson 2012年

__unicode__在Python 3中对我不起作用。但是,__str__按下面的答案中的说明进行了工作
Dan King,

Answers:


168

__unicode__做到了。您的模型应如下所示:

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

在Python 3上,您需要使用__str__

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

1
我愚蠢地没有注意到我为每个模型都声明了unicode方法,除了这个模型。:doh:对不起。
patrickn'2

29

使用该__str__方法可在Python3和Django1.8上运行:

class MyModel(models.Model):

    name = models.CharField(max_length=60)

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

3
这也为我解决了。我也使用Python3和Django1.8。
Teodor Scorpan,2015年

str是旧方法.....但是python 3与Django一起使用,新方法(unicode)不起作用?
user798719

13

__unicode__正如其他人所提到的,您看到的字符串来自方法。但是问题是,管理员在创建日志事件时会保存对象的字符串表示形式,因此,如果__unicode__在保存日志条目后添加实现,则只有在进行一些新活动后,您才能在旧项目上看到新标题


我只是想知道为什么在设置unicode后,Actions日志没有显示名称-我应该知道这只是存储在db中的日志,在创建时会记录数据!
markwalker_ 2012年

2
谢谢,如果您不解释的话,会给我带来很大麻烦
dtc

7

提到的答案__str____unicode__方法是正确的。正如所陈述的文档,但是由于1.6版(我认为),你可以使用python_2_unicode_compatible装饰商的Python 2和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"

您也可以在非Model对象中使用以上内容。


3

您需要定义要显示的列...

例如:

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

2

您认为这样__unicode__做是正确的。我现在正在运行:

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

当我查看“最近动作”列表时,会看到刚刚编辑的电影的标题。


2

使用def str(self):这将起作用,它返回self.title

使用类似:

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

1

由于这个问题已有6年历史,所以很多事情都已改变。让我对其进行更新。使用python3.6和最新版本的Django(2.1.2),您应该始终__str__()在新代码中使用。__unicode__()是python2.7的老故事,因为在python3中strunicode


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.