【问题标题】:How to supply a QuerySet to an included template?如何为包含的模板提供 QuerySet?
【发布时间】:2017-09-01 18:25:31
【问题描述】:

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

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

有没有更好的方法来做到这一点?

<!-- 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>

【问题讨论】:

    标签: django django-templates django-queryset django-context


    【解决方案1】:

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

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

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

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

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

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

    {% recent_issues as recent_issues %}
    

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

    【讨论】:

    • 成功了,非常感谢。我以为我已经尝试过这样做,但我一定在某个地方犯了错误。感谢您提供非常明确的指示。
    【解决方案2】:

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

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

    ?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-15
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 2020-03-24
      • 2011-07-29
      相关资源
      最近更新 更多