【问题标题】:Using keys with spaces使用带空格的键
【发布时间】:2010-12-16 03:31:12
【问题描述】:

有没有办法在 Django 模板中执行以下操作?

   {% for hop in hops%}
    <tr>  
      <td>{{ hop.name }}</td>
      <td>{{ hop.mass }}</td>  
      <td>{{ hop."boil time" }}</td>
    </tr>
  {% endfor %}

跳跃。“煮沸时间”不起作用。简单的解决方案是重命名键煮沸时间,但我对替代品感兴趣。

【问题讨论】:

    标签: python django google-app-engine dictionary django-templates


    【解决方案1】:

    最好的方法是将属性名称偷偷带入另一个变量,如下所示:

    {% for key, value in hop.items %}
        {% ifequal key 'boil time' %}
            {{ value }}
        {% endifequal %}
    {% endfor %}
    

    在 Django 0.96(Google AppEngine 使用的版本)中,模板语言不支持元组扩展,所以有点丑:

    {% for hop in hops %}
        <tr>
            <td>{{ hop.name }}</td>
            <td>{{ hop.mass }}</td>
            <td>
                {% for item in hop.items %}
                    {% ifequal item.0 'boil time' %}
                        {{ item.1 }}
                    {% endifequal %}
                {% endfor %}
            </td>
        </tr>
    {% endfor %}
    

    因此,获取您的代码,我们最终得到:

    {% for hop in hops %}
        <tr>
            <td>{{ hop.name }}</td>
            <td>{{ hop.mass }}</td>
            <td>
                {% for key, value in hop.items %}
                    {% ifequal key 'boil time' %}
                        {{ value }}
                    {% endifequal %}
                {% endfor %}
            </td>
        </tr>
    {% endfor %}
    

    在 Django 0.96(Google AppEnginge 上的版本)中,变为:

    {% for hop in hops %}
        <tr>
            <td>{{ hop.name }}</td>
            <td>{{ hop.mass }}</td>
            <td>
                {% for item in hop.items %}
                    {% ifequal item.0 'boil time' %}
                        {{ item.1 }}
                    {% endifequal %}
                {% endfor %}
            </td>
        </tr>
    {% endfor %}
    

    甚至还有更冗长的方法可以使用 regroup 标签:

    {% regroup hop.items by 'boil time' as bt %}
        {% for item in bt %}
            {% if forloop.first %}
                {% for item2 in item.list %}
                    {% for item3 in item2 %}
                        {% if not forloop.first %}
                            {{ item3 }}
                        {% endif %}
                    {% endfor %}
                {% endfor %}
            {% endif %}
    {% endfor %}
    

    【讨论】:

    • Django 模板语言不允许这样做。 hop['boil time'] 的模板语言等效为 hop.boil time(我认为这是他遇到的问题)。
    • 这是我在上面所做的评论的参考,表明. 符号涵盖了索引...docs.djangoproject.com/en/dev/ref/templates/api/…
    • 我很欣赏写出所有代码的努力,但由于某种原因,它似乎对我不起作用,复制和粘贴事件。即使没有 ifequals,我也无法对字典进行迭代以打印任何键或值。
    • Dan,我实际上在我正在运行的一个实例上测试了代码,并且它在两种情况下都有效......我唯一能想到的是项目的问题。试着做一个 {{ hop.items }} 看看会发生什么。如果字典覆盖了 items 方法,这可能会导致问题(例如,hop 具有“items”属性,然后尝试 hop.iteritems)
    • 您可以通过在 main.py 中指定版本来在 Google App Engine 上实际使用 Django 1.0(或 1.1):code.google.com/appengine/docs/python/tools/…
    【解决方案2】:

    您可以使用来自 djangosn-ps 的 get 过滤器:http://www.djangosnippets.org/snippets/1412/

    (重命名密钥可能更好......)

    【讨论】:

    • 我会试一试,然后告诉你进展如何。
    • 伙计,我做的 Ruby 太多了。我的倾向是monkeypatch dict 将下划线转换为空格...
    • 我可能应该提到我在 google appengine 中使用 django 模板,而不是完整的 django 应用程序。似乎没有添加过滤器的简单方法。
    【解决方案3】:

    对于 django 0.96,这是 Google Appengine 用于模板的,以下工作:

    {% for hop in recipe.get_hops %}
        {% for item in hop.items %}
              {% ifequal item.0 'boil time' %}
                  <p>{{ item.1 }}</p>
              {% endifequal %}
            {% endfor %}   
      {% endfor %}
    

    item.0 是键,item.1 是值。 Link.

    【讨论】:

      猜你喜欢
      • 2018-10-05
      • 2017-08-18
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 2019-08-04
      • 2020-05-07
      • 1970-01-01
      相关资源
      最近更新 更多