【问题标题】:django - filtering objects across multiple templates?django - 跨多个模板过滤对象?
【发布时间】:2018-04-12 16:30:55
【问题描述】:

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

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

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”将其调用到模板中

【问题讨论】:

    标签: python django django-views django-queryset


    【解决方案1】:

    你有两种可能。首先,您可以定义两个上下文变量(就像在您的链接解决方案中所做的那样),或者您可以在模板中定义 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 参数。它使视图保持简洁,您不必查询两次。 如果不发表评论,我希望这会有所帮助。

    【讨论】:

    • 切片看起来干净多了。问题似乎是,当我在频道模板上时,它没有找到任何“projects_by_channel 中的项目”,而只是显示 {% empty %} 部分。感觉好像 generic.ListView 的 template_name 部分只允许它在该模板上工作,如果这有意义的话?
    • 对于不同的视图,你必须定义不同的视图函数。因此,在另一个模板上,您必须编写一个视图,并且在这些视图中,您必须为每个模板定义上下文变量。第二个模板必须在某处有视图。如果您使用“包含”,则将应用相同的变量。
    猜你喜欢
    • 2014-05-25
    • 2011-06-18
    • 2020-12-14
    • 2021-11-17
    • 2011-12-08
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多