django - 跨多个模板过滤对象?

时间:2017-10-31 13:21:43

标签: python django django-views django-queryset

我正在尝试跨两个模板过滤对象。一个(父母)应该显示最近更新的五个,另一个应该显示所有这些。

我让后者与以下代码完美配合:

views.py:

...
class ChannelProjectList(generic.ListView):
    context_object_name = 'projects_by_channel'
    template_name = 'channels/projects_by_channel.html'

    def get_queryset(self):
       self.channel = get_object_or_404(Channel, slug=self.kwargs['slug'])
       return Project.objects.filter(channel=self.channel)
...

HTML:

{% for project in projects_by_channel %}
 {{project.name}}
{% endfor %}

但是当我在父页面上“包含”它时,它会中断。经过一些研究后,我理解为什么会发生这种情况以及为什么这不是正确的方法。我挖了一下,找到this,这似乎正是我想要做的,但是当我实现它时,它不仅没有起作用,而且打破了正常工作的页面。

这感觉就像一个非常简单的事情,但由于这是我的第一个项目,我每天都在遇到新事物,这就是其中之一。

最终解决方案:

this的帮助下,我意识到我需要将相同的get_queryset复制到第二个模板视图中,然后我可以使用“view.channel_projects”将其调用到模板中

1 个答案:

答案 0 :(得分:0)

你有两种可能性。首先,您可以定义两个上下文变量(例如在链接的解决方案中完成),或者您可以slice模板中的qs

<强> 1。选项切片:

这个会显示全部:

{% for project in projects_by_channel %}
 {{project.name}}
{% endfor %}

这仅显示5个条目:

{% for project in projects_by_channel|slice:":5" %}
 {{project.name}}
{% endfor %}

<强> 2。选项定义两个查询集: (views.py)

def get_queryset(self):
   self.channel  = get_object_or_404(Channel, slug=self.kwargs['slug'])
   self.channel2 = get_object_or_404(Channel, id=12)#whatever
   context["list"]  = Project.objects.filter(channel=self.channel)
   context["list2"] = Project.objects.filter(channel=self.channel2)[0:5] #this slices the query set for the first entries. If you want to order them first(by date or whatever) use "order_by()"
   return context

(HTML)

{% for project in list %}
 {{project.name}}
{% endfor %}


{% for project in list2 %}
 {{project.name}}
{% endfor %}

如果你想显示单个qs但是一次显示整个事物而在另一个模板中只显示前5个,你更适合在模板中使用slice参数。它使视图保持干净简单,您不必查询两次。 我希望如果不发表评论会有所帮助。