【问题标题】:Loop over a sorted dictionary a specific number of times in a django template在 django 模板中循环排序字典特定次数
【发布时间】:2012-08-14 06:51:22
【问题描述】:

我有一个包含排序选项的排序字典:

sort_options = SortedDict([
    ("importance" , ("Importance" , "warning-sign")),
    ("effort" , ("Effort" , "wrench" , "effort")),
    ("time_estimate" , ("Time Estimate" , "time")),
    ("date_last_completed" , ("Date Last Completed" , "calendar")),
])  

我在我的模板中显示这些选项:

{% for key, icon in sort_options.items %}<!-- Sort Options -->
    <a class="btn btn-info" href={{ request.path }}?key={{ key }}&orientation=desc><i class="icon-{{ icon.1 }} icon-large"></i></a>
{% endfor %}

我需要定义 4 个排序选项,但我只想显示前 3 个(其余选项在其他地方使用)。我还预计会添加其他不需要显示的排序选项。我可以编写一个带有 forloop 计数器的 if 语句来防止显示最后一个选项,但这似乎很浪费。

我找到了this filter,但我不确定如何将它与需要键和图标数据的 forloop 结合起来。

如何编写一个在字典上运行并且只循环 X 次的循环的 django 模板?

【问题讨论】:

    标签: django for-loop django-templates


    【解决方案1】:

    与乔的回答类似,但实际上有 a built-in filter slice 会为您执行此操作:

    {% for key, icon in sort_options.items|slice:":3" %}
    

    【讨论】:

    • 很好,似乎比创建自定义标签更简单。感谢分享。
    【解决方案2】:

    我认为您可以使用模板过滤器来做到这一点。例如,在:

    ./mymodules/templatetags/mytags.py

    @register.filter
    def get_recent(object, token):
        """
        Must pass a Option Dictionary 
        """
        return object.items()[:token]
    

    然后在你的模板中:

    {% load mytags %}
    
    {% for option in sort_options|get_recent:3 %}
        key: {{ option.0  }} 
        value: {{ option.1 }}
    {% endfor %}
    

    我没有机会测试上面的代码,但认为逻辑是合理的。让我知道你的想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 2015-11-25
      • 2016-08-31
      • 2016-05-26
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多