如何向包含的模板提供 QuerySet?

How to supply a QuerySet to an included template?

我有一个用于杂志网站的简单 Django 应用程序,它的边栏显示了最近一期的链接。侧边栏是它自己的模板,然后我将其包含到其他页面中。我希望最近问题的查询集成为边栏包含的一部分,而不是在边栏出现的页面视图中。 (这既是为了避免重复,更重要的是,是为了让侧边栏在没有视图的平面上发挥作用。)

这似乎是 simple/common 应该做的事,但我找不到好的方法。我查看了自定义模板标签、上下文管理器等,但我看到的所有选项都希望 return 字符串或字典,而不是查询集。所以我最终做了一个包含模板标签(下面的代码),并且基本上为我想要显示的问题构建了一个字典。它工作正常,但对我来说真的很笨重和脆弱,而且它混合了逻辑和显示非常糟糕。

有更好的方法吗?

<!-- app_name/templates/sidebar.html -->
...
{% load pr_extras %}
...
<ul class="nav nav-sidebar">
    <li><a href="/">Home</a></li>
    <li>Previous Issues</li>
    <li>{% show_recent %}</li>
</ul>
...


# app_name/templatetags/pr_extras.py

from django import template
from mag.models import Issue

register = template.Library()

@register.inclusion_tag('recent.html')
def show_recent():
    issues = Issue.objects.order_by('-issue_num')[1:6]
    iss_dict = {}
    for i, iss in enumerate(issues):
        k = "recent_%d" % i
        iss_dict[k] = "%s %s %d" % (iss.issue_num, iss.get_season_display(), iss.year)
        u = "url_%d" % i
        iss_dict[u] = iss.issue_pdf
    return iss_dict


<!-- app_name/templates/recent.html -->
    <ul class="nav nav-sidebar">
        <li><a href="/static/uploads/{{ url_0 }}">Issue {{ recent_0 }}</a></li>
        <li><a href="/static/uploads/{{ url_1 }}">Issue {{ recent_1 }}</a></li>
        <li><a href="/static/uploads/{{ url_2 }}">Issue {{ recent_2 }}</a></li>
        <li><a href="/static/uploads/{{ url_3 }}">Issue {{ recent_3 }}</a></li>
        <li><a href="/static/uploads/{{ url_4 }}">Issue {{ recent_4 }}</a></li>
    </ul>

上下文处理器是执行此操作的典型方法。

def recent_issues(request):
    {'recent_issues': return Issue.objects.order_by('-issue_num')[1:6]}

将上下文处理器添加到 TEMPLATES 设置后,您可以在模板中访问 recent_issues

或者,如果您不希望上下文处理器为 每个 视图 运行,您可以使用 simple_tag 装饰器创建模板标签(在 Django < 1.9 中使用赋值标签)。

@register.simple_tag
def recent_issues():
    return Issue.objects.order_by('-issue_num')[1:6]

在您的模板中,使用标记将查询集分配给变量

{% recent_issues as recent_issues %}

您现在可以在模板中循环 recent_issues

也许我不太明白你的问题,但你是不是在找这样的东西:

{% include "some_include_template.html" with some_list=some_list some_var=some_var %}

?