GAE + django 1.2的问题

时间:2011-03-02 13:38:19

标签: python html django google-app-engine escaping

我已升级到django 1.2,现在我收到此错误消息,该消息与i18n相关。你能告诉我该怎么做吗?感谢

global name '_' is not defined
Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 515, in __call__
    handler.get(*groups)
  File "/base/data/home/apps/classifiedsmarket/blobstore.348713784647505124/i18n.py", line 252, in get
    loginmsg = loginmsg + '<a href=\"%s\">%s</a>' % ('login',_("Log in"))
NameError: global name '_' is not defined

在添加新的import语句后更新代码看起来像

   # let user choose authenticator        
        for p in openIdProviders:
            p_name = p.split('.')[0] # take "AOL" from "AOL.com"
            p_url = p.lower()        # "AOL.com" -> "aol.com"
            loginmsg = loginmsg + '<a href="%s">%s</a> ' % ( #'','')
             #      users.create_login_url(federated_identity=p_url), p_name)
                    'google.com', p_name)
        loginmsg = loginmsg + '<a href=\"%s\">%s</a>' % ('login',_("Log in"))

并在模板中

    <ul><li><a href="ai">{% trans "Add" %}</a></li>
    <li><a href="li">{{ latest.modified|date:"d M" }}</a></li>                  
<li>{% if user %}<a href="{{ user_url|fix_ampersands }}">{% trans "Log out" %}</a>
{% else %}{% trans "Log in" %}{{loginmsg}}{% endif %}</li>
</ul>

在视图中引导垃圾,就像这里预期输出是链接和按钮的图像一样。你能告诉我一点吗?感谢

enter image description here

现在检查了HTML,看来它是escpae编码的东西。你告诉我吗?

<ul><li><a href="ai">Add</a></li><li><a href="li">03 Mar</a></li>                   

<li>Log in&lt;a href=&quot;google.com&quot;&gt;Google&lt;/a&gt; &lt;a href=&quot;google.com&quot;&gt;Yahoo&lt;/a&gt; &lt;a href=&quot;google.com&quot;&gt;MySpace&lt;/a&gt; &lt;a href=&quot;google.com&quot;&gt;AOL&lt;/a&gt; &lt;a href=&quot;login&quot;&gt;Log in&lt;/a&gt;</li>

</ul>

2 个答案:

答案 0 :(得分:2)

看起来你不见了

from django.utils.translation import gettext_lazy as _

但我不知道为什么它在以前的版本中有效。

答案 1 :(得分:2)

Old Django 1.0 manual找到了这个(我认为App Engine的默认版本是0.98)。

以下是答案:

  

标准翻译:

     

Python的标准库gettext模块将_()安装到全局命名空间中,作为gettext()的别名。在Django,我们选择不遵循这种做法,原因有两个:

     

对于国际字符集(Unicode)支持,ugettext()比gettext()更有用。有时,您应该使用ugettext_lazy()作为特定文件的默认转换方法。如果没有全局命名空间中的_(),开发人员必须考虑哪个是最合适的翻译功能。

     

下划线字符(_)用于表示Python的交互式shell和doctest测试中的“之前的结果”。安装全局_()函数会导致干扰。明确地将ugettext()导入为_()可以避免这个问题。

这就是为什么旧的工作原理,同时在Django 1.2中你需要指定:

from django.utils.translation import gettext_lazy as _

正如Niklas R所说。