使用Django模板从{dic}列表中创建上下文表

时间:2017-10-17 08:56:21

标签: python django django-templates

假设我有以下词典列表:

fruits = [
    {"Name": "Apple", "id": 1, "url": "/apple", "Desc": "Red or green skin with white flesh."},
    {"Name": "Pear", "id": 2, "url": "/pear", "Desc": "Green fruit with white flesh."},
    {"Name": "Coconut", "id": 3, "url": "/coco", "Desc": "Brown hairy shell with with flesh."}
]

并通过视图传递给Django模板的上下文。我将如何构建一个看起来像这样的上下文表?

<小时/> A
Apple
红色或绿色皮肤与白色的肉。

C
Coconut
棕色毛壳与肉。

P
Pear
绿色水果与白肉。

我在考虑做这样的事情:

{% for fruit in fruits %}
    <B>{{ fruit.Name|first_letter_upper }}</B><BR>
    <A HREF="{{ fruit.url }}">{{ fruit.Name }}</A><BR>
    {{ fruit.Desc }}<BR>
    {% if not forloop.last %}<BR>{% endif %}
{% endfor %}

但是我必须实现自定义过滤器“first_letter_upper”。没什么大不了的,但我只是想知道是否有一种更简单的方法可以做到这一点,而不必使用自定义过滤器?

2 个答案:

答案 0 :(得分:1)

您可以通过合并sliceupper来获得大写的第一个字母。

如果您只想让该字母出现一次,如果您有多个带有该字母的项目(例如Apple和Avocado),那么您可以使用ifchanged

{% for fruit in fruits %}
    {% ifchanged %}<B>{{ fruit.Name|slice:":1"|upper }}</B><BR>{% endifchanged %}
    <A HREF="{{ fruit.url }}">{{ fruit.Name }}</A><BR>
    {{ fruit.Desc }}<BR>
    {% if not forloop.last %}<BR>{% endif %}
{% endfor %}

答案 1 :(得分:0)

您可以使用内置的capfirst

{{ fruit.Name|capfirst }}