我突然在以前工作的代码中遇到了一个奇怪的错误。我最近从1.9.4升级到Django 1.9.6。
在我的一个观点中,我有:
from django.contrib import messages
from django.utils.translation import ugettext_lazy as _
messages.success(request, str( _('A string with a ') +
'<a target="_blank" href="/preview/' + mymodel.hash + '">' +
_('link!') + '</a>.'), extra_tags="safehtml"
)
这现在在最后一行给出了TypeError
:
Can't convert '__proxy__' object to str implicitly
为什么?我该如何解决?
这可以通过在ugettext_lazy()
中包装对str()
的第二次调用来修复(即代码变为str( _('link!') )
。这样做可以使视图呈现良好。现在我的问题是:为什么?整个复合字符串已经包含在str()
中,并且因为我说,这段代码与之前版本的django一起工作正常。这是一个错误吗?
__proxy__
是翻译字符串,在字符串中使用对象之前不会确定其实际翻译结果(即在此处使用ugettext_lazy
而不是ugettext
时会发生什么)。
根据给定的Documentation link:
使用延迟转换作为参数调用str()将在当前语言环境中生成一个字符串。