将所有类压缩到一个继承自
TemplateResponseMixin的类,如
DetailView所示(也查看
SingleObjectTemplateResponseMixin)并覆盖其get_template_names()方法以返回适合当前情况的模板.
def get_template_names(self):
"""
Return a list of template names to be used for the view.
"""
model_type = self.get_model_type()
model_name = self.get_model_name()
templates = [
'zinnia/%s/%s/entry_list.html' % (model_type, model_name),
'zinnia/%s/%s_entry_list.html' % (model_type, model_name),
'zinnia/%s/entry_list.html' % model_type,
'zinnia/entry_list.html']
if self.template_name is not None:
templates.insert(0, self.template_name)
return templates
Django将获取该名称列表并尝试每个项目以查看它是否存在于templates文件夹中.如果是,则使用该模板.
更新
在仔细查看您的代码之后,可能是这样的:
在你的主urls.py
# convert each url
url(r'^$', FrontpageView.as_view()),
url(r'^history/$', HistoryView.as_view()),
url(r'^calendar/$', CalendarView.as_view()),
url(r'^news/$', NewsView.as_view()),
url(r'^visitors/$', VisitorsView.as_view()),
...
# to just
url(r'^(?P[\w\d/-]+)/$', SuperSpecialAwesomeView.as_view()),
# but, put this at the end of urls list after any routes that don't use this view
在设置类属性模型之后,DetailView将检查slug是否在url的kwargs中,如果是,它将使用slug进行模型查找,就像你正在做的那样:Article.ojects.get(slug) = self.kwargs [ ‘蛞蝓’])
models.py
您可以在文章模型中添加类型字段.该类型将指定它是什么类型的文章.例如,您的ChildrenView,YouthView和AdultView都可以拥有一种音乐类型(因为模板都是音乐,我假设它们是相关的).
ARTICLE_TYPE_CHOICES = (
(0, 'music'),
(1, 'weddings'),
(2, 'outreach'),
...
)
class Article(models.Model):
...
type = models.IntegerField(choices=ARTICLE_TYPE_CHOICES)
...
然后,在views.py中
class SuperSpecialAwesomeView(DetailView):
template_name = None
model = Article
def get_template_names(self):
slug = self.kwargs.get('slug', '')
templates = [
# create a template based on just the slug
'{0}.html'.format(slug),
# create a template based on the model's type
'{0}.html'.format(self.object.get_type_display()),
]
# Allow for template_name overrides in subclasses
if self.template_name is not None:
templates.insert(0, self.template_name)
return templates
鉴于一个带有一种音乐类型和一些事工/儿童的文章实例,Django将寻找一个名为ministry / children.html的模板和一个名为music.html的模板.
如果你需要为其他视图做一些特殊的事情(比如你可能需要SermonsView),那么子类SuperSpecialAwesomeView
class SermonsView(SuperSpecialAwesomeView):
paginate_by = 2
queryset = Article.objects.order_by('-publish_date')