0

我有一些代码可以从数据存储中提取项目列表。

它们看起来像这样:

class List(db.Model):
  name = db.StringProperty(multiline=True)

class Item(db.Model):
  name = db.StringProperty(multiline=True)
  created = db.DateTimeProperty(auto_now_add=True)
  completed = db.DateTimeProperty(auto_now_add=False)

在 Django 模板中,我希望仅在至少有一个列表元素要显示时有条件地显示表头。我很惊讶这是多么困难。

例如:

{% for list in lists %}
   <font size="+2"><b>{{ list.name }}</b></font><br>
   <table><tr><th>&nbsp;</th><th>item</th><th>created</th><th>completed</th></tr>
   {% for item in list.items %}
      {% ifnotequal item.completed None %}
        <tr><td>&nbsp;</td><td>{{ item.name }} </td><td>{{ item.created }} </td><td>{{ item.completed }} </td></tr>
      {% endifnotequal %}
   {% endfor %}
   </table>
{%endfor%}

如果列表中没有任何符合条件的项目,我会得到一张丑陋的空表,如下所示:

**todo**
item    completed   delete

我想做类似的事情,在 Django 中设置一个变量,比如

{% set first = 1 %}

然后当我要为表格输出至少一项时,执行类似的操作

   {% for item in list.items %}
      {% ifnotequal item.completed None %}
         {% if first %}
           <table><tr><th>&nbsp;</th><th>item</th><th>created</th><th>completed</th></tr>
           {% set first = 0 %}
         {% endif %}
       .... do the rest of the stuff
       {% endifnotequal %}

因此,我尝试为 Django 创建一个自定义标签,该标签将在 appengine 中很好地发挥作用,如下所述:

一种解决方案

另一种解决方案

并遇到了很多错误,甚至尝试了这些页面上的建议:

另一个有类似问题的人

没有得到任何地方。我正在使用 Python 2.7。这不应该这么难。

4

1 回答 1

1

这里不需要任何自定义模板标签。

{% for list in lists %}
   {% for item in list.items %}
       {% if forloop.first %}     
           <font size="+2"><b>{{ list.name }}</b></font><br>
           <table><tr><th>&nbsp;</th><th>item</th><th>created</th><th>completed</th></tr>

等等

所有这一切都是将标头移动到内部 for 循环中,并仅在第一次迭代时输出。如果列表为空,它将永远不会进入该内部循环,并且永远不会输出标题。

于 2013-02-12T00:52:00.300 回答