在Django中迭代特定组中的项目

时间:2013-04-26 07:19:05

标签: python django django-templates iteration

在我的Django模板中,我希望能够遍历组和项目,但我想迭代其组下面的项目。到目前为止,我让他们像这样迭代,但它没有显示项目属于哪个组。我将如何迭代模板以获得此包含?

查看:

def manage(request):
    group_list = Group.objects.order_by('name').filter(user=request.user)
    item_list = Item.objects.order_by('name').filter(user=request.user)
    return render(request, 'manage.html', {'group_list': group_list, 'item_list': item_list})

模板:

{% extends "base.html" %}

{% block content %}

{% for group in group_list %}
    {{ group.name }}<br />
{% endfor %}

{% for item in item_list %}
    {{ item.name }}<br />
{% endfor %}

{% endblock %}

更新

模特(对不起忘了包含这个):

class Group(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=30)

class Item(models.Model):
    user = models.ForeignKey(User)
    group = models.ManyToManyField(Group)
    name = models.CharField(max_length=30)

2 个答案:

答案 0 :(得分:2)

您的方法会执行额外的数据库命中。出于性能原因,您应该只选择具有相关组的项目,如下所示:

def manage(request):
  item_list = Item.objects.order_by(
                'group__name', 'name').filter(
                user=request.user).select_related('group')
  return render(request, 'manage.html', {'item_list': item_list})

模板如下所示:

{% extends "base.html" %}
{% block content %}
{% for item in item_list %}
  {% ifchanged item.group.name %}
    {{ item.group.name }}<br />
  {% endifchanged %}
  {{ item.name }}<br />
{% endfor %}
{% endblock %}

这样,无论有多少组,您只能拥有一个数据库。

答案 1 :(得分:0)

我猜你从一个组到另一个组有一个fk

class Item(models.Model):
    group = models.ForeignKey(Group)

的观点:

def manage(request):
    group_list = Group.objects.order_by('name').filter(user=request.user)
    return render(request, 'manage.html', {'group_list': group_list})

模板:

{% extends "base.html" %}

{% block content %}

{% for group in group_list %}
    {{ group.name }}<br />

    <p>Item for this group</p>
    {% for item in group.item_set.all %}
        {{item.name}}
    {% endfor %}
{% endfor %}

{%endblock%}