无法在Google App Engine HTML模板中输出字典键值

3 投票
2 回答
810 浏览
提问于 2025-04-16 16:32

我似乎无法让Python的dict在我的HTML模板中输出它的值。下面的代码只是打印了一个空的select元素。

main.py:

feeds = {'feed1' : 'http://test1.xml',
         'feed2' : 'http://test2.xml'}

template_values = {'movieFeeds': feeds}
        
self.response.out.write(template.render(temp, template_values))

index.html:

<select>
  {% for (key,value) in movieFeeds.items %}
  <option value="{{value}}">{{key}}</option>
  {% endfor %}
</select>

把它改成下面的代码就能输出键了:

for key in movieFeeds

你们觉得我哪里出错了呢?

编辑:

新代码:

{% for (key,value) in movieFeeds.items() %}
  <option value="{{key}}">{{key}}</option>
{% endfor %}

错误:

Traceback (most recent call last):
  File "/opt/google_appengine/google/appengine/ext/webapp/__init__.py", line 634, in __call__
    handler.get(*groups)
  File "/home/thomas/workspace/movieMashup/src/main.py", line 71, in get
    self.response.out.write(template.render(temp, template_values))
  File "/opt/google_appengine/google/appengine/ext/webapp/template.py", line 72, in render
    t = load(template_path, debug)
  File "/opt/google_appengine/google/appengine/ext/webapp/template.py", line 100, in load
    template = django.template.loader.get_template(file_name)
  File "/opt/google_appengine/lib/django_0_96/django/template/loader.py", line 80, in get_template
    template = get_template_from_string(source, origin, template_name)
  File "/opt/google_appengine/lib/django_0_96/django/template/loader.py", line 88, in get_template_from_string
    return Template(source, origin, name)
  File "/opt/google_appengine/lib/django_0_96/django/template/__init__.py", line 158, in __init__
    self.nodelist = compile_string(template_string, origin)
  File "/opt/google_appengine/lib/django_0_96/django/template/__init__.py", line 174, in compile_string
    return parser.parse()
  File "/opt/google_appengine/lib/django_0_96/django/template/__init__.py", line 273, in parse
    compiled_result = compile_func(self, token)
  File "/opt/google_appengine/lib/django_0_96/django/template/loader_tags.py", line 154, in do_extends
    nodelist = parser.parse()
  File "/opt/google_appengine/lib/django_0_96/django/template/__init__.py", line 273, in parse
    compiled_result = compile_func(self, token)
  File "/opt/google_appengine/lib/django_0_96/django/template/loader_tags.py", line 132, in do_block
    nodelist = parser.parse(('endblock', 'endblock %s' % block_name))
  File "/opt/google_appengine/lib/django_0_96/django/template/__init__.py", line 273, in parse
    compiled_result = compile_func(self, token)
  File "/opt/google_appengine/lib/django_0_96/django/template/defaulttags.py", line 542, in do_for
    sequence = parser.compile_filter(bits[3])
  File "/opt/google_appengine/lib/django_0_96/django/template/__init__.py", line 338, in compile_filter
    return FilterExpression(token, self)
  File "/opt/google_appengine/lib/django_0_96/django/template/__init__.py", line 558, in __init__
    raise TemplateSyntaxError, "Could not parse the remainder: %s" % token[upto:]
TemplateSyntaxError: Could not parse the remainder: ()

2 个回答

1

正如@systempuntoout所说,这在Django 0.96版本中是不支持的。你可以让App Engine使用Django 1.2版本来解决这个问题:

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

from google.appengine.dist import use_library
use_library('django', '1.2')
2

在Django 0.96版本中,你不能使用 {% for key, value in data.items %} 这种写法。
可以试试下面这个方法:

{% for item in movieFeeds.items %}
     <option value="{{ item.0 }}">{{ item.1 }}</option>   
{% endfor %}

撰写回答