【问题标题】:coercing to Unicode: need string or buffer, UserProfile found强制转换为 Unicode:需要字符串或缓冲区,找到 UserProfile
【发布时间】:2015-01-17 19:57:56
【问题描述】:

当我尝试在 Django1.7 的管理面板中查看 FileShare 时,我收到此错误

coercing to Unicode: need string or buffer, UserProfile found

我的模型.py

class UserProfile(models.Model):
    user = models.OneToOneField(User,primary_key=True)
    def __unicode__(self):
        return self.user.username
    User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

class FileDetails(models.Model):
    fileId = models.CharField(max_length = 100,primary_key=True,db_index=True)        
    def __unicode__(self):
        return self.fileId

class Permission(models.Model):
    user = models.ForeignKey(UserProfile)
    def __unicode__(self):
        return self.user

class FileShare(models.Model):
    owner = models.ForeignKey(UserProfile)
    file_requested=models.ForeignKey(FileDetails)
    permission=models.ManyToManyField(Permission)
    def __unicode__(self):
        return str(self.owner)

为什么会出现这个错误?我该如何纠正它?

【问题讨论】:

    标签: python admin django-1.7


    【解决方案1】:

    您的Permission 对象在转换为Unicode 时返回UserProfile 对象:

    class Permission(models.Model):
        user = models.ForeignKey(UserProfile)
        def __unicode__(self):
            return self.user
    

    __unicode__ method 必须始终返回 unicode 对象,而不是。您可以使用self.user 上的unicode() type 来提供这样的值:

    class Permission(models.Model):
        user = models.ForeignKey(UserProfile)
        def __unicode__(self):
            return unucode(self.user)
    

    您可能希望在您的 FileShare 模型中做同样的事情:

    class FileShare(models.Model):
        owner = models.ForeignKey(UserProfile)
        file_requested=models.ForeignKey(FileDetails)
        permission=models.ManyToManyField(Permission)
        def __unicode__(self):
            return unicode(self.owner)
    

    您在那里使用str(),这将导致一个包含 UTF-8 字节的字符串,然后必须再次(隐式)解码。但是 Python 会尝试为此使用 ASCII 编解码器,如果所有者用户名包含除 ASCII 字符之外的任何其他字符,则解码将失败。

    【讨论】:

      【解决方案2】:

      当你为 Permission 定义 __unicode__ 方法时,它应该是 return str(self.user) 而不是 return self.user

      【讨论】:

        猜你喜欢
        • 2012-06-06
        • 2021-03-28
        • 2015-02-01
        • 2013-11-23
        • 2014-12-21
        • 2012-04-12
        • 2011-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多