为什么__unicode__不起作用但是__str__呢?

时间:2013-08-12 14:39:01

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

我试图通过自己开发一个网站来打破一些摇滚,我首先创建一些注册表页面并列出数据库记录。

我对__unicode__方法不打印我的记录的用户名和__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

感谢你提前合作!

2 个答案:

答案 0 :(得分:14)

看起来您使用的是Python3.x,这里是relevant documentation on Str and Unicode methods

  

在Python 2中,对象模型指定__str__()__unicode__()   方法。如果存在这些方法,则必须返回str(bytes)和   unicode(文本)。

     

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

     

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

所以

  

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

答案 1 :(得分: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