我目前在views.py中做了类似的事情:
def home(request):
ingredients = Ingredience.objects.all()
drinks = Ingredience.objects.filter(category_id=1)
fruits = Ingredience.objects.filter(category_id=2)
etc.
meats = Ingredience.objects.filter(category_id=25)
return render_to_response('home.html', {'ingredients': ingredients, 'drinks': drinks, 'fruits': fruits, 'meats': meats,}, context_instance=RequestContext(request))
这是我的models.py:
from django.db import models
class IngredienceCategory(models.Model):
name = models.CharField(max_length=30)
def __unicode__(self):
return self.name
class Ingredience(models.Model):
name = models.CharField(max_length=30)
category = models.ForeignKey(IngredienceCategory, null=True, blank=True)
def __unicode__(self):
return self.name
class Food(models.Model):
name = models.CharField(max_length=30)
ingredients = models.ManyToManyField(Ingredience)
def __unicode__(self):
return self.name
django中有一些技巧可以动态生成模板对象(即饮料,水果,肉类)吗?我甚至不知道从哪里开始,但我想做这样的事情:循环遍历所有成分对象并返回字典,该字典将保存按类别分组的项目(如第一个示例中所示)。
我试图用这个解决2个问题:
编辑:在我的模板中,我需要能够通过自己的变量访问每个对象(即饮料,水果,肉类等)(例如{{drinks}}。
答案 0 :(得分:1)
好的,根据您的评论,您希望能够在模板中访问fruits
,meats
等。这是一个可能的解决方案既不是令人难以置信的pythonic也不是高效的,但这只是为了让它更容易理解:
ingredients = Ingredience.objects.all()
context = {}
for i in ingredients:
context[i.category.name + 's'] = context.get(i.category.name + 's', []) + [i]
return render_to_response('home.html', context, context_instance=RequestContext(request))
然后您可以将其作为fruits
,meats
等进行访问.Dangango是否有针对您正在寻找的内容?据我所知,这是一个非常罕见的用例 - 但也许其他一些人可以提供答案。基本上你要实现的是对上下文字典对象进行一些巧妙的操作,以便类别成为关键。如果是这种情况,您可能会发现某些用途也在查看this SO question。
更新:只是为了澄清我在上面的代码中正在做的事情:我创建一个名为context
的字典,然后继续循环遍历所有成分。对于每种成分,我都为类别名称添加了一个字典条目,其中包含一个带有成分的数组。如果名称已经在上下文字典中,那么它只是附加此成分。它会将所有成分添加到可通过其所在类别的名称访问的数组中。