Django模板中的嵌套循环 [英] Nested loop in Django template
问题描述
$ b
模板:
{%for item in ingrcat%}
< h2> {{item.name}}< / h2>
< ul>
{%for ingr in XXX%}
< li>< a href =#id =i {{ingr.id}}> {{ingr.name}}< ; / A>< /锂>
{%endfor%}
< / ul>
{%endfor%}
XXX - 应该是
查看:
def home(request):$ b $如果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':食物,配料:配料,'ingrcat':ingrcat,'用户名':用户名,'email':电子邮件,}
else:
context = {}
newcontext = {}
$ b $ context = dict(context.items()+ newcontext.items())
return render_to_response('home.html',context,context_instance = RequestContext(request))
Models:
from django.db import models $ b $ from django.contrib.auth.models import User
类IngredienceCategory(models.Model):
name = models.CharField(max_length = 30)
user = models.ForeignKey(User,null = True,blank = True )
$ b $ class Meta:
verbose_name_plural =元素类别
def __unicode __(self):
返回self.name
类成分(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
$ b $ 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)
$ b $ class Meta:
verbose_name_plural =Foods
$ b $ def __unicode __(self):
return self.name
关系。
pre $ lt; code> {%for item in ingrcat%}
< h2> {{item.name}}< ; / H2>
< ul>
{item for 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
I can't get my head around this. I need to somehow access the object in the parent loop but I'm not sure how. Here is what I've come up with so far. I marked the problematic area in the code with XXX:
Template:
{% 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 - should be a list of ingredients belonging to the ingredience category which is currently being looped through in the parent loop.
View:
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))
Models:
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
You can use backwards relationships.
{% 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 %}
See documentation:
https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward
这篇关于Django模板中的嵌套循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!