【问题标题】:Nested loop in Django templateDjango模板中的嵌套循环
【发布时间】:2012-10-25 07:14:00
【问题描述】:

我无法理解这一点。我需要以某种方式访问​​父循环中的对象,但我不确定如何。到目前为止,这是我想出的。我用 XXX 标记了代码中的问题区域:

模板:

{% for item in ingrcat %}
    <h2>{{ item.name }}</h2>
    <ul>
        {% for ingr in XXX %}
        <li><a href="#" id="i{{ ingr.id }}">{{ ingr.name }}</a></li>
        {% endfor %}
    </ul>
{% endfor %}

XXX - 应该是属于当前在父循环中循环的成分类别的成分列表。

查看:

def home(request):
    if request.user.is_authenticated():
        username = request.user.username
        email = request.user.email
        foods = Food.objects.filter(user=request.user).order_by('name')
        ingredients = Ingredience.objects.filter(user=request.user).order_by('name')
        ingrcat = IngredienceCategory.objects.filter(user=request.user)

        context = {}
        for i in ingredients:
            context[i.category.name.lower()] = context.get(i.category.name.lower(), []) + [i]

        newcontext = {'foods': foods, 'ingredients': ingredients, 'ingrcat': ingrcat, 'username': username, 'email': email,}
    else:
        context = {}
        newcontext = {}

    context = dict(context.items() + newcontext.items())

    return render_to_response('home.html', context, context_instance=RequestContext(request))

型号:

from django.db import models
from django.contrib.auth.models import User

class IngredienceCategory(models.Model):
    name = models.CharField(max_length=30)
    user = models.ForeignKey(User, null=True, blank=True)

    class Meta:
        verbose_name_plural = "Ingredience Categories"

    def __unicode__(self):
        return self.name


class Ingredience(models.Model):
    name = models.CharField(max_length=30)
    category = models.ForeignKey(IngredienceCategory, null=True, blank=True)
    user = models.ForeignKey(User, null=True, blank=True)

    class Meta:
         verbose_name_plural = "Ingredients"

    def __unicode__(self):
        return self.name


class Food(models.Model):
    name = models.CharField(max_length=30)
    ingredients = models.ManyToManyField(Ingredience)
    html_id = models.CharField(max_length=30, null=True, blank=True)
    user = models.ForeignKey(User, null=True, blank=True)

    class Meta:
        verbose_name_plural = "Foods"

    def __unicode__(self):
        return self.name

【问题讨论】:

  • 您需要包含模型定义,以便查看它们之间的关系。
  • 对。现在包括模型。

标签: django loops for-loop django-templates django-views


【解决方案1】:

您可以使用反向关系。

{% for item in ingrcat %}
<h2>{{ item.name }}</h2>
<ul>
    {% for ingr in item.ingredience_set.all %}
    <li><a href="#" id="i{{ ingr.id }}">{{ ingr.name }}</a></li>
    {% endfor %}
</ul>
{% endfor %}

查看文档:

https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward

【讨论】:

  • 感谢指点,我不知道你可以这样倒退!但是,我收到模板错误Could not parse the remainder: '()' from 'item.ingredience_set.all()'。我尝试了ingredience_set 的一些变体,但无法正常工作。
  • 啊,是的,我弄错了。在您不使用 () 的模板中。 {% for ingr in item.ingredience_set.all %} 应该可以解决问题。
【解决方案2】:

在 obj.manytomanyfield 上执行 get_queryset

{% for item in ingrcat %}
<h2>{{ item.name }}</h2>
<ul>
    {% for ingr in item.ingredients.get_queryset %}
    <li><a href="#" id="i{{ ingr.id }}">{{ ingr.name }}</a></li>
    {% endfor %}
</ul>
{% endfor %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-11
    • 2012-12-01
    • 2020-08-03
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    相关资源
    最近更新 更多