Django - 如何通过类视图将对象传递给模板?
我在我的项目中开始使用基于类的视图,主要是因为这样可以减少重复的代码。不过,我现在遇到一个问题,就是不知道怎么把一个对象传递给模板。默认情况下,使用详细视图会把对象传过去,这样可以直接访问对象的属性,这没问题。但是我的对象上有一些标签,这些标签是通过一个扩展定义的,需要通过那个扩展的一个函数来访问。在我以前的基于函数的视图中,我会获取标签的列表,然后像这样把它传递给模板,以便进行迭代:
return render(request, "gallerypage.html", {
'gallery': gallery,
'tags': gallery.misc_tags.names(),
'form': form
})
我的新视图看起来是这样的:
class GalleryView(DetailView):
model = Gallery
template_name = 'gallerypage.html'
urls.py:
urlpatterns = patterns('',
url(r'^(?P<pk>\d+)/$', GalleryView.as_view(), name='show_gallery'),
url(r'^(?P<pk>\d+)/edit/$', GalleryUpdate.as_view(), name='update_gallery',),
)
画廊对象可以顺利传递到模板中,我可以通过类似 <h1>{{ object.name }}</h1>
的方式访问它的属性,比如名称。但是,考虑到在模板中运行任意的 Python 代码并不是个好主意,我需要找到一个更好的方法,把标签对象传递到模板中,以便我可以显示它们,因为像这样直接写
{{ object.misc_tags.names()|join:", " }}
是行不通的。谢谢!
2 个回答
1
调用 object.misc_tags.names
时,如果不加括号,就会隐式地调用这个函数。你也可以像 dm03514 建议的那样,使用 get_context_data
。
根据 Django 文档 关于模板中点号的说明:
从技术上讲,当模板系统遇到一个点时,它会按以下顺序进行查找:
- 字典查找
- 属性查找
- 方法调用
- 列表索引查找
2
你可以重写 get_context_data
这个方法,来添加你想要的额外信息。这个方法在基于类的视图(CBV)中经常被重写。