Django模型中使用ugettext_lazy触发异常
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _
@python_2_unicode_compatible
class ProductType(ModelBaseObj):
""" 生产产品类型"""
name = models.CharField(_(u'产品类型'), max_length=64, unique=True)
def __str__(self):
return u'%s' % self.name
class Meta:
verbose_name = _(u'产品类型')
verbose_name_plural = verbose_name
db_table = u'basedata_product_type'
app_label = _(u'basedata') # 此处不能使用惰性翻译
以下是报错信息
# ......
import_module
__import__(name)
File "/home/oee/oee/urls.py", line 22, in <module>
url(r'^admin/', admin.site.urls),
File "/home/venvs/lib/python2.7/site-packages/django/contrib/admin/sites.py", line 280, in urls
return self.get_urls(), 'admin', self.name
File "/home/venvs/lib/python2.7/site-packages/django/contrib/admin/sites.py", line 272, in get_urls
regex = r'^(?P<app_label>' + '|'.join(valid_app_labels) + ')/$'
TypeError: sequence item 2: expected string or Unicode, __proxy__ found
判断是字符串拼接错误,问题产生原因如下:
标准Python字符串拼接(”.join([…]) ) 将不会工作在包括惰性翻译对象的列表上。 作为替代,你可以使用django.utils.translation.string_concat()
from django.utils.translation import string_concat
from django.utils.translation import ugettext_lazy
name = ugettext_lazy(u'John Lennon')
instrument = ugettext_lazy(u'guitar')
result = string_concat([name, ': ', instrument])
if __name__ == "__main__":
print(result)
# >> [u'John Lennon', ': ', u'guitar']