在Django通用视图中指定不同的模板名称

时间:2009-03-24 15:00:50

标签: python django django-urls

我的urls.py中有代码用于我的通用视图;

infodict = {
'queryset': Post.objects.all(),
'date_field': 'date',
'template_name': 'index.html',
'template_object_name': 'latest_post_list',
}

urlpatterns += patterns('django.views.generic.date_based',
(r'^gindex/$', 'archive_index', infodict),
)

因此,转到地址/ gindex /将使用带有'index.html'模板的通用视图。

但是由于我在这个urlpattern中会有更多的通用视图,我应该如何使用相同的infodict提供不同的模板名称?我不想使用大量的infodicts,我也不能使用默认的模板名称。

请注意,这也适用于infodict中的模板对象名称。

感谢您的帮助!

修改: 这是我关于stackoverflow的第一个问题之一,我对这些彻底的答案感到惊讶! 我更喜欢使用我不知道的dict构造函数。我发现使用python文档有点困难,因为我找不到我想要的东西!

再次感谢所有答案和不同的方法。

4 个答案:

答案 0 :(得分:8)

使用dict()构造函数:

infodict = {
    'queryset': Post.objects.all(),
    'date_field': 'date',
    'template_name': 'index.html',
    'template_object_name': 'latest_post_list',
}

urlpatterns = patterns('django.views.generic.date_based',
    url(r'^gindex/$', 'archive_index', dict(infodict, template_name='gindex.html')),
    url(r'^hindex/$', 'archive_index', dict(infodict, template_name='hindex.html')),
)

答案 1 :(得分:1)

如果要为不同的视图提供不同的模板名称,通常的做法是将唯一的字典传递给每个URL模式。例如:

urlpatterns = patterns('',
    url(r'^home/$', 'my.views.home', {'template_name': 'home.html'}, name='home'),
    url(r'^about/$', 'my.views.about', {'template_name': 'about.html'}, name='about'),
)

这种模式很常见且可以接受。

答案 2 :(得分:0)

不是那么简单,但如果你有很多不同的模式匹配同一个视图,那么可能很有用:

base_dict={
...
#defaults go here
}
def make_dict(template_name,template_object_name):
    base_dict.update({
        'template_name':template_name,
        'template_object_name':template_object_name,
    })
    return base_dict

urlpatterns += patterns('django.views.generic.date_based',
(r'^gindex/$', 'archive_index', make_dict('index1.html','latest_poll_list')),
(r'^hindex/$', 'archive_index', make_dict('index2.html','oldest_poll_list')),
)

对于许多类似的通用视图,这会将代码调用压缩一点点,但会牺牲一些透明度。如果您有许多行自定义相同的几个参数,这可能是最容易阅读的。

最后,如果您的所有或大部分观看都需要一些(但不是全部)相同的信息,那么永远不要忘记context processor有多么有用。设置比上述解决方案只需要更多的工作,但它扩展得更好,因为它将保证(除非您使用不带RequestContext关键字的render_to_response快捷方式),无论如何,模板始终可以使用默认值你的观点或网址变化。

答案 3 :(得分:0)

您可以定义包装器视图函数以参数化通用视图。 在你的urls.py中添加模式

url(r'^/(?P<tmpl_name>\w+)/$', 'my.views.datebasedproxy')
在views.py中添加视图功能

def datebasedproxy(request, tmpl_name):
    return django.views.generic.date_based(request,otherparameters,
    template_name=tmpl_matrix[tmpl_name])

其中tmpl_matrix是假设列表,它将模板文件名与参数匹配,其他参数代表date_based函数所需的其他字典项