Django中无效的块标签i=0

1 投票
2 回答
856 浏览
提问于 2025-04-16 08:43

我在看Appengine的Python入门指南,特别是关于模板的部分时,修改了一个简单的留言簿代码,想在留言旁边加上简单的编号。

在index.html文件中,我添加了我认为相关的代码。

index.html(我在第3行加了{%i=0%},第5行加了{%i+=1%},第7行加了{{i}},其余部分来自指南):

<html>
  <body>
    {%i=0%}
 {% for greeting in greetings %}
    {%i+=1%}
   {% if greeting.author %}
        <b>{{i}}:{{ greeting.author.nickname }}</b> wrote:
      {% else %}
       An anonymous person wrote:
      {% endif %}
      <blockquote>{{ greeting.content|escape }}</blockquote>
    {% endfor %}

    <form action="/sign" method="post">
      <div><textarea name="content" rows="3" cols="60"></textarea></div>
      <div><input type="submit" value="Sign Guestbook"></div>
    </form>

    <a href="{{ url }}">{{ url_linktext }}</a>

  </body>
</html>

结果我遇到了以下错误:

TemplateSyntaxError: Invalid block tag: 'i=0'

我查阅了Django关于模板的帮助文档,里面提到:

Django模板系统提供了一些标签,这些标签的功能类似于某些编程结构——比如用于布尔测试的if标签、用于循环的for标签等等——但这些标签并不是简单地执行相应的Python代码,模板系统也不会执行任意的Python表达式。

所以我猜,模板系统并不适合用来进行计算。

总结一下

有没有人能告诉我怎么在Django模板中给我的留言编号,或者使用“计数器 - 增加”的方法?

我觉得这段代码可能不是必要的,但为了完整性,

未修改的helloworld.py代码:

import os
from google.appengine.ext.webapp import template
import cgi

from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db

class Greeting(db.Model):
    author = db.UserProperty()
    content = db.StringProperty(multiline=True)
    date = db.DateTimeProperty(auto_now_add=True)

class MainPage(webapp.RequestHandler):
def get(self):
    greetings_query = Greeting.all().order('-date')
    greetings = greetings_query.fetch(10)

    if users.get_current_user():
        url = users.create_logout_url(self.request.uri)
        url_linktext = 'Logout'
    else:
        url = users.create_login_url(self.request.uri)
        url_linktext = 'Login'

    template_values = {
        'greetings': greetings,
        'url': url,
        'url_linktext': url_linktext,
        }

    path = os.path.join(os.path.dirname(__file__), 'index.html')
    self.response.out.write(template.render(path, template_values))
class Guestbook(webapp.RequestHandler):
    def post(self):
        greeting = Greeting()

        if users.get_current_user():
            greeting.author = users.get_current_user()

        greeting.content = self.request.get('content')
        greeting.put()
        self.redirect('/')

application = webapp.WSGIApplication(
                                     [('/', MainPage),
                                      ('/sign', Guestbook)],
                                     debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

2 个回答

2

来自 http://www.djangobook.com/en/beta/chapter04/

{% for item in todo_list %}
    <p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}
0

这要看你需要它做什么。如果你想要实际的数量,可以在模板中使用一个循环:http://docs.djangoproject.com/en/dev/ref/templates/builtins/#for

然后你可以用 forloop.counterforloop.counter0 来查看索引。

如果你只是想显示一串数字,可以用HTML的有序列表。

Django的模板引擎主要是用来设计的,尽量不要在里面做计算。如果你需要在模板层对数据进行处理,可以写一个自定义标签/过滤器

撰写回答