如何向包含的模板提供 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 %}
?
我有一个用于杂志网站的简单 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 %}
?