【问题标题】:Dynamically generate template (context) objects in django view在 django 视图中动态生成模板(上下文)对象
【发布时间】:2012-07-08 02:17:37
【问题描述】:

我目前正在我的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 中是否有一些技巧可以动态生成模板对象(即饮料、水果、肉类)?我什至不知道从哪里开始,但我想这样做:遍历所有成分对象并返回字典,该字典将保存按类别分组的项目(如第一个示例中所示)。

我正在尝试解决两个问题:

  1. 每个类别对象的代码几乎相同,因此有一个 很多冗余。
  2. 每次添加新的时我都必须更新views.py 分类到数据库中。

编辑:在我的模板中,我需要能够通过其自己的变量(例如 {{ Drinks }})访问每个对象(即饮料、水果、肉类等)。

【问题讨论】:

  • 动态是什么意思?动态基于什么?
  • @DanielRoseman 动态我的意思是我不必在views.py 中一个一个地手动输入对象,但它们会根据数据库中的数据自动生成。不知道我是否足够清楚。
  • 恐怕我还是不太明白问题出在哪里。当然,可以使用 Category.objects.all() 从数据库中获取类别。你到底卡在哪里了?
  • @DanielRoseman 我编辑了我的原始帖子。在我的模板中,我需要能够通过自己的变量(例如{{饮料}}访问每个对象(即饮料、水果、肉类等)。目前我正在通过在我的视图中手动指定每个对象来做到这一点。我想自动完成。这是否澄清了问题?

标签: django django-views


【解决方案1】:

好的,根据您的 cmets,您希望能够在您的模板中访问 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 等身份访问它。Django 是否有您正在寻找的东西?据我所知,这是一个非常罕见的用例 - 但也许其他一些人可以提供答案。本质上,您要实现的是对上下文字典对象的一些巧妙操作,以便类别成为键。如果是这种情况,您可能会发现还可以查看 this SO question

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

【讨论】:

  • “模糊”是指我不知道您要在模板中做什么。另外,您所说的“动态”是指您只想要一个查询并且仍然可以访问所有单独的成分吗?
  • 感谢您的回答。我目前正在使用重组,但问题是我无法分别控制每个类别。简化示例:在左侧边栏中,我想显示类别 1、2、3 中的项目,并在右侧边栏中显示类别 4、5、6 中的项目。据我所知,重组是不可能的。
  • 您的最后一次编辑就我想要实现的目标而言是正确的:将类别名称转换为字典键。感谢您澄清这一点。关于您发布的实际解决方案,我似乎无法正常工作。老实说,我的 Django/Python 技能相当有限,所以我可能无法完全理解你在那里做什么。 1.您在类别名称中添加“s”,据我了解,这不是必需的,但可能只是一个细节。 2、category.name和成分的model不同,你真的可以通过i.category.name访问吗?
  • 另外,我想测试上下文的输出,但我不确定如何。
  • 是的,您确实可以通过 i.category.name 访问相关模型(如果 i 有一个名为 category 的字段,而 Category 模型有一个名为 @987654331 的字段@)。是的,s 绝对可以被忽略——事实上,我建议把它忽略——它只是为了给你fruits 而不是fruit(单数)。打印上下文:只需使用print context,在运行 Django 的控制台中查看输出是什么
猜你喜欢
  • 1970-01-01
  • 2015-11-23
  • 2012-01-30
  • 2021-07-26
  • 2022-01-18
  • 2017-11-23
  • 2020-07-05
  • 1970-01-01
  • 2013-03-26
相关资源
最近更新 更多