【发布时间】: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