【问题标题】:Accessing a custom queryset in a django template for-loop在 django 模板 for-loop 中访问自定义查询集
【发布时间】:2018-09-26 05:15:38
【问题描述】:

我想像这样在 Django 模板中循环查询集:

{% for thing in things %}
//Do stuff
{% endfor %}

但我不想遍历我所有的“东西”,而是其中的一个子集。 可以说我的东西模型有一个字符域“颜色”。现在我只想遍历颜色不是无的东西。 我现在将在我的模型中创建一个自定义查询集,如下所示:

def colored_things(self):
   return things.objects.filter(color__isnone=False)

但是如果我回到我的模板循环我的彩色东西,它的行为就好像它是空的(我的 for 循环的 {% empty %} 部分被触发)。

{% for thing in things %}
//Do stuff
{% empty %}
{% endfor %}

那么我需要做什么才能在我的模板中访问我的自定义查询集(在模型中创建,但如果有帮助,我可以将它放在其他地方)?

【问题讨论】:

  • 只需将其作为属性并在您的模板中使用
  • 你的问题不清楚。 colored_things 是哪个类的方法?你怎么称呼那个方法?你如何将结果传递给模板?
  • colored_things 是 things-model 中的一个方法。 @Daniel 我想这是我的问题。如何将结果传递给我的模板?我想我可以通过调用 for 循环中的方法来访问它们。我尝试将它作为一个属性,它的行为方式与方法相同
  • 根据您的用例,您可以在模型中使用@property@cached_property,定义自定义模型管理器或自定义查询集。如果至少没有模型和视图的基本示例,就很难提供准确的答案。您的方法colored_things 没有任何意义。我们看不到things 来自哪里以及它是什么。最终你想写self.objects...
  • 这么说吧……您使用的是基于类的视图还是常规视图,所以我们知道您是如何将变量传递给模板的。因为真正的colored_things 将是如果来自模型one = Color.objects.get(id=1) 的结果然后not_colored = one.colored_things() 不合逻辑,我还是会从视图中进行查询,因为它与基于模型实例本身的结果无关。跨度>

标签: python django django-models django-templates


【解决方案1】:

向模型添加(如果您还没有)get_context 方法并添加包含过滤器的上下文属性。 我会看起来像这样:

def get_context(self, request, *args, **kwargs):
    context = super(THINGS-MODEL, self).get_context(request, *args, **kwargs)
    context['colored_things'] = THINGS-MODEL.objects.filter(color__isnone=False)
    return context

现在在您的模板中,您可以循环遍历包含您之前在 get_context 方法中设置的过滤数据的colored_things

【讨论】:

  • 我删除了该评论,因为您的编辑已过时。但是该模型没有get_context 方法。您可能正在考虑视图,因为基于类的视图具有该方法。如果 OP 使用 CBV,这会很好用,不幸的是他没有在他的问题中透露。
猜你喜欢
  • 2012-12-28
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
相关资源
最近更新 更多