在django视图中动态生成模板(上下文)对象

时间:2012-07-08 09:57:29

标签: django django-views

我目前在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个问题:

  1. 每个类别对象的代码几乎相同,所以有一个 很多冗余。
  2. 每次添加新内容时都必须更新views.py 数据库的类别。
  3. 编辑:在我的模板中,我需要能够通过自己的变量访问每个对象(即饮料,水果,肉类等)(例如{{drinks}}。

1 个答案:

答案 0 :(得分:1)

好的,根据您的评论,您希望能够在模板中访问fruitsmeats等。这是一个可能的解决方案既不是令人难以置信的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))

然后您可以将其作为fruitsmeats等进行访问.Dangango是否有针对您正在寻找的内容?据我所知,这是一个非常罕见的用例 - 但也许其他一些人可以提供答案。基本上你要实现的是对上下文字典对象进行一些巧妙的操作,以便类别成为关键。如果是这种情况,您可能会发现某些用途也在查看this SO question

更新:只是为了澄清我在上面的代码中正在做的事情:我创建一个名为context的字典,然后继续循环遍历所有成分。对于每种成分,我都为类别名称添加了一个字典条目,其中包含一个带有成分的数组。如果名称已经在上下文字典中,那么它只是附加此成分。它会将所有成分添加到可通过其所在类别的名称访问的数组中。

相关问题