我在我的项目中切换到基于类的视图,因为它们的重复代码较少,我无法弄清楚如何将对象传递给模板。默认情况下,使用详细视图会传递对象,这对于访问它的直接属性很合适,但我的对象上有标记,这些标记通过扩展定义并通过该扩展的功能访问。在我以旧的基于函数的视图中,我将获取标记列表并将其传递给模板,如下所示:
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',),
)
将gallery对象传递给模板,我可以使用<h1>{{ object.name }}</h1>
之类的东西访问它的属性,例如名称。但是看到尝试在模板中运行任意Python代码不是一个好主意,我需要一种更好的方法将标签对象传递到模板中,这样我就可以显示它们,如
{{ object.misc_tags.names()|join:", " }}
对它不起作用。感谢
答案 0 :(得分:2)
您可以覆盖get_context_data
并添加所需的任何其他上下文。这种方法经常在CBV中被覆盖
答案 1 :(得分:1)
在没有括号的情况下调用object.misc_tags.names
将隐式调用该函数。或者像{dm03514那样使用get_context_data
建议。
从模板中的django docs期间开始:
从技术上讲,当模板系统遇到一个点时,它会按以下顺序尝试以下查找:
- 字典查找
- 属性查找
- 方法调用
- 列表索引查找