【问题标题】:Pattern to organize related items into groups将相关项目组织成组的模式
【发布时间】:2015-04-26 09:34:30
【问题描述】:

让我尝试通过一个小示例应用程序来解释我想要实现的目标。这是一个购物清单应用程序,可让您将预定义的Items 添加到您的ShoppingListGroceries。明智的做法是每个Item 都与Store 相关。

当我将杂货添加到我的购物清单后,我应该能够看到我的购物清单,其中包含按商店组织(分组)的杂货。比如:

如何创建视图和模板来分组和显示此购物清单?

例如:我会这样显示所有商店的完整库存:

#views.py
store_list = Store.objects.all()

#template.html
{% for store in store_list %}
<div>{{store}}
    <ul>
    {% for item in store.item_set.all %}
        <li>{{item}}</li>
    {% endfor %}
    </ul>
</div>
{% endfor %}

这不适用于我的购物清单,但我真的在寻找同样强大/优雅的东西......

【问题讨论】:

    标签: python django models


    【解决方案1】:

    内置的regroup模板标签呢?

    {% regroup item.objects.all by store as store_groups %}
    
    <ul>
    {% for store_group in store_groups %}
        <li>{{ store_group.grouper }}
        <ul>
            {% for item in store_group.list %}
              <li>{{ item }}</li>
            {% endfor %}
        </ul>
        </li>
    {% endfor %}
    </ul>
    

    【讨论】:

    • 这出乎意料。在大约两年的时间里,我几乎没有使用 Django,我发誓当时没有这些好东西可用。中肯的建议,这个问题通过答案越来越好。
    【解决方案2】:

    在视图的后端而不是模板中进行分组。

    在你看来,像这样创建一个字典:

    sorted_groceries = {
        store1 : [item1, item2],
        store2 : [item3, item4],
    }
    

    这可以通过一些类似于此伪代码的代码来完成:

    sorted_groceries = {}
    for item in shopping cart:
        try:
            sorted_groceries[item.store].append(item)
        except KeyError:
            sorted_groceries[item.store] = [item]
    

    然后将其添加到您的上下文中,并让您的模板如下所示:

    {% for store, items in sorted_groceries.items %}
    <div>{{store}}
        <ul>
        {% for item in items %}
            <li>{{item}}</li>
        {% endfor %}
        </ul>
    </div>
    {% endfor %}
    

    【讨论】:

    • 首先,您的“伪代码”胜过我的实际 Python 代码。这是多么令人沮丧? ;) 除此之外,感谢优雅的代码。我担心在 Django 模型 API 中会有一种方法来处理这个问题,但我忽略了它。我猜不是,这行得通。
    【解决方案3】:

    如何使用 ifchanged https://docs.djangoproject.com/en/1.7/ref/templates/builtins/#ifchanged

    假设 shopping_list 按商店排序:

    {% for item in shopping_list %}
         {% ifchanged %}<h3>{{ item.store.name }}</h3>{% endifchanged %}
         {{ item.name }}
    {% endfor %}
    

    【讨论】:

    • 这适用于这个例子,我不太确定我是否可以调整它以涵盖我将遇到的用例。根据@GraphicsNoob 的答案在视图中分组可能会增加一些灵活性。尽管如此,还是有用的。
    猜你喜欢
    • 2011-04-16
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2013-12-29
    • 2012-06-02
    • 2015-07-19
    相关资源
    最近更新 更多