我正在尝试跨两个模板过滤对象。一个(父母)应该显示最近更新的五个,另一个应该显示所有这些。
我让后者与以下代码完美配合:
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”将其调用到模板中
答案 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
参数。它使视图保持干净简单,您不必查询两次。
我希望如果不发表评论会有所帮助。