管理中显示的对象类型而不是 def __unicode__ 中的特定值

Posted

技术标签:

【中文标题】管理中显示的对象类型而不是 def __unicode__ 中的特定值【英文标题】:Object type instead of specific value from def __unicode__ showed in admin 【发布时间】:2015-07-06 21:52:51 【问题描述】:

根据link1和link2,我制作了在另一个模型中列为kierunek = models.ForeignKey('Kierunek', default=1)的模型,并作为选择的名称显示self.nazwa_kierunku。一切正常,但我无法得到def __unicode__ 的工作。我也试过def __str__。总是有“Object Kierunek”这个名字。

我的一个代码示例。我尝试了很多变体:

from django.db import models

class Kierunek(models.Model):
    nazwa_kierunku = models.CharField('Nazwa kierunku', max_length=100)
    created = models.DateTimeField('Timecreated', auto_now_add=True, null=True)
    modified = models.DateTimeField('Timeupdated', auto_now=True, null=True)
    def __unicode__(self):
        return self.nazwa_kierunku

class Meta:
    verbose_name = "Nazwa kierunku"
    verbose_name_plural = "Nazwy kierunkow"

【问题讨论】:

Python 3中没有unicode类型,所以没有__unicode__魔术方法。 【参考方案1】:

假设您使用的是 pyhton 3

__str__() and  __unicode__() methods

在 Python 2 中,对象模型指定 str() 和 unicode() 方法。如果这些方法存在,它们必须返回 str(字节)和 分别为 unicode(文本)。

print语句和str内置调用str()来确定 对象的人类可读表示。内置的 unicode 如果存在则调用 unicode(),否则回退到 str() 并使用系统编码对结果进行解码。相反,Model 基类自动派生 str() 从 unicode() 通过编码为 UTF-8。

在 Python 3 中,只有 str(),它必须返回 str(文本)。

(也可以定义bytes(),但是Django应用 这种方法用处不大,因为他们几乎从不处理 字节。)

Django 提供了一种简单的方法来定义 str() 和 unicode() 适用于 Python 2 和 3 的方法:您必须定义一个 str() 方法返回文本并应用 python_2_unicode_compatible() 装饰器。

在 Python 3 上,装饰器是无操作的。在 Python 2 上,它定义了 适当的 unicode() 和 str() 方法(替换 过程中的原始 str() 方法)。这是一个例子:

from __future__ import unicode_literals
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class MyClass(object):
    def __str__(self):
        return "Instance of my class"

这种技术最适合 Django 的移植理念。

为了向前兼容,这个装饰器在 Django 中可用 1.4.2.

最后,请注意 repr() 必须在所有版本的 蟒蛇。

来源https://docs.djangoproject.com/en/1.8/topics/python3/#str-and-unicode-methods

【讨论】:

以上是关于管理中显示的对象类型而不是 def __unicode__ 中的特定值的主要内容,如果未能解决你的问题,请参考以下文章

如何设置显示内容而不是显示对象

7-3 如何让对象支持上下文管理

如何查询以便显示模型的字段而不是实际模型

如何查询以便显示每个实例的字段而不是实际实例

为啥时间仍然显示 UTC 时区而不是 settings.TIME_ZONE?

姜戈。从表单对象访问模板中的外键字段