【问题标题】:Why __unicode__ doesn't work but __str__ does?为什么 __unicode__ 不起作用但 __str__ 起作用?
【发布时间】:2024-08-22 04:45:02
【问题描述】:

我正在尝试通过自己开发一个网站来打破僵局,我从创建一些注册表页面和列出数据库记录开始。

我对@9​​87654321@ 方法不打印我的记录的用户名而__str__ 不打印这一事实感到困扰!

我知道使用__unicode__ 是最好的做法,但我只能使用__str__ 打印我的对象用户名。

谁能解释为什么会这样?

我的模特:

from django.db import models

class User(models.Model):
    username = models.CharField(max_length=200)
    reg_date = models.DateTimeField('registry date')

    def __unicode__(self):
        return self.username

我的 admin.py:

from django.contrib import admin
from registo.models import User

admin.site.register(User)

我的__unicode__(self) 输出:

User
    User object

我的__str__(self) 输出:

User
    Teste

提前感谢您的合作!

【问题讨论】:

  • 你使用的是哪个版本的 Django?
  • 你好,苏迪普塔!感谢您的快速答复! :)。我使用的是 1.5.1 版本!谢谢

标签: django string python-3.x django-models unicode


【解决方案1】:

看起来你正在使用Python3.x,这里是relevant documentation on 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(文本)。

所以

在 Python 3 上,装饰器是无操作的。在 Python 2 上,它定义了 适当的 __unicode__()__str__() 方法(替换 过程中的原始__str__() 方法)。

【讨论】:

  • 你好 Karthikr!感谢您的快速答复! :)。所以,因为在 python 3 中只有 str,我只能用它来打印我想要的对象,从现在开始,对吗?感谢您在此处粘贴文档! :)
  • 没错。如果你想要兼容性,你可以查看python_2_unicode_compatible装饰器
  • 好的。我感谢您的帮助!由于这是一个版本“问题”,我有点松了一口气,因为这不是我的问题:)。再次感谢您的帮助! :)
【解决方案2】:

如果它不是 python 3 的东西,那么您发布的代码的缩进不正确 - 不确定是复制/粘贴错误还是代码中的情况。但是您的 User 模型的方法需要缩进,如下所示:

from django.db import models

class User(models.Model):
    username = models.CharField(max_length=200)
    reg_date = models.DateTimeField('registry date')

    def __unicode__(self):
        return self.username

【讨论】:

  • 不会在类外引用self 引发异常吗?
  • 如果函数被调用,当然可以。但如图所示,该函数只是在模块级别定义的,并且永远不会调用该代码路径。
  • 你好亚当!感谢您的快速答复。所以......我正在使用pyCharm,我猜这个标识是正确的!我避免复制粘贴以了解更多信息,但我尝试使用您的代码+标识,但结果是一样的! :/。谢谢您的帮助! :)
  • 是的,意思是复制/粘贴到 SO 问题中。您能否展示一个 python shell 会话,显示您如何获得 __str____unicode__ 输出 - iow、u= User.objects.get()print repr(u.__unicode__())print repr(u.__str__())
  • 我猜那是 Python 3.0 “东西” :) 正在窃听我的应用程序 Adam :S。关于 shell 会话,我输入了这些命令,但 print repr 显示为“无效语法”:)
最近更新 更多