【问题标题】:Unicode issue in DjangoDjango中的Unicode问题
【发布时间】:2012-09-11 21:35:38
【问题描述】:

Deal 模型中的 deal_instance_name 似乎存在 unicode 问题。

上面写着:

coercing to Unicode: need string or buffer, __proxy__ found

异常发生在这一行:

return smart_unicode(self.deal_type.deal_name) + _(u' - Set No.')  + str(self.set)

如果我删除 smart_unicode(self.deal_type.deal_name),这条线会起作用,但为什么?

当时在 Django 1.1 中,有人在 Stackoverflow 上遇到了同样的问题,我已经尝试了 unicode() 和新的 smart_unicode(),没有任何乐趣。

请问我会遗漏什么?

class Deal(models.Model):
    def __init__(self, *args, **kwargs):
        super(Deal, self).__init__(*args, **kwargs)      
        self.deal_instance_name = self.__unicode__()      

    deal_type           = models.ForeignKey(DealType)
    deal_instance_name  = models.CharField(_(u'Deal Name'), max_length=100)    
    set                 = models.IntegerField(_(u'Set Number'))

    def __unicode__(self):
        return smart_unicode(self.deal_type.deal_name) + _(u' - Set No.')  + smart_unicode(self.set)

    class Meta:
        verbose_name = _(u'Deal')
        verbose_name_plural = _(u'Deals')

交易类型:

class DealType(models.Model):    
    deal_name           = models.CharField(_(u'Deal Name'), max_length=40)
    deal_description    = models.TextField(_(u'Deal Description'),     blank=True)

    def __unicode__(self):
        return smart_unicode(self.deal_name) 

    class Meta:
        verbose_name = _(u'Deal Type')
        verbose_name_plural = _(u'Deal Types')

【问题讨论】:

    标签: django unicode unicode-string


    【解决方案1】:

    其实smart_unicode部分与你的问题无关:

    from django.utils.translation import ugettext_lazy
    stuff = u'abc' + ugettext_lazy(u'efg')
    

    会引发完全相同的问题。

    这基本上是因为ugettext_lazy(u'efg') 不会返回unicode 字符串,而是__proxy__,当您执行u'abc' + ugettext_lazy(u'eg') 时会引发错误。

    您会遇到完全相同的问题:u'a' + 1

    您可以使用以下方法解决此问题:

    from django.utils.translation import ugettext_lazy
    stuff = u'abc {0}'.format(ugettext_lazy(u'efg'))
    

    或者,您可以使用unicode(ugettext_lazy(u'efg'))ugettext_lazy(u'efg') 强制转换为unicode 对象。

    【讨论】:

    • 啊,我明白了。所以我这样做是为了返回__unicode()__,对吗?
    • @Kave 是的,将smart_unicode(self.deal_type.deal_name) + _(u' - Set No.') + smart_unicode(self.set) 替换为u'{0} {1} {2}'.format(self.deal_type.deal_name, _(u' - Set No.'), self.set)
    • 完美。我解决了类似于你的建议,这也可以吗?似乎正在工作:return u'%s%s%s' % (self.deal_type.deal_name, _(u' - Set No.'), self.set)
    • @Kave 是的,它也有效! (但你应该在较新的代码中使用str.format!;))
    • 啊谢谢指正。我从一本旧的 Django 1.0 书中学习了 Django/Python。 :)
    猜你喜欢
    • 2014-02-24
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    相关资源
    最近更新 更多