我正在使用Django开发博客。我正在使用通用视图,即。
from django.views.generic import dates
from django.views.generic.list import ListView
这些工作正常,但我也希望在博客中实现一个可搜索的,可折叠的树,它将所有条目作为另一个可导航工具。即
2016
Dec
01 - Entry 1
03 - Entry 2
Mar
23 - Entry 3
2015
Nov
01 - Entry 4
etc.
我目前正在使用regroup和CSS在HTML模板中执行此操作,我将其包含在每个通用视图使用的每个HTML模板中:
{% block sidebar %}
{% include '../blog_archive_tree.html' %}
{% endblock %}
我的问题是,现在我需要对每个通用视图进行子类化,以便我可以将查询集Objects.all()传递给模板来创建树,这感觉就像我失去了使用的好处通用类。
来自urls.py:
from django.views.generic.list import ListView
from coltrane.models import Category
urlpatterns = [
url(r'^$',
ListView.as_view(model=Category),
]
到此:
from coltrane.models import Category
from coltrane.models import Entry
class ArticleCategoryListView(ListView):
model = Category
def get_context_data(self, **kwargs):
context = super(ArticleCategoryListView, self).get_context_data(**kwargs)
context['for_tree_view'] = Entry.objects.all()
return context
urlpatterns = [
url(
r'^$',
ArticleCategoryListView.as_view(),
name='coltrane_category_list'),
)
我以这种方式设置了六个通用视图,每个视图都需要一个子类。必须有一个更好的方法来做到这一点?我曾考虑过每次对博客进行更改时预渲染blog_archive_tree.html创建的HMTL,但在每次更改时在实时环境中覆盖静态文件对我来说似乎不是一种非常稳定的方法。
任何见解/建议/替代方案都会受到欢迎。
注意 - 更新2017.01.02 根据Daniel Roseman的评论,我使用Inclusion Tag来实现所需。
由于模板已经写好,这似乎是一种巧妙的方法。
在应用程序模板标签(coltrane / templatetags / coltrane_tags.py)文件中,我添加了以下内容:
from coltrane.models import Entry
@register.inclusion_tag('blog_archive_tree.html')
def entries_tree():
entries = Entry.objects.all()
return {'for_tree_view': entries}
在模板中调用标记:
{% load coltrane_tags %}
{% entries_tree %}