Django - 如何使用基于类的视图将对象传递给模板?

时间:2014-04-09 14:25:04

标签: python django templates

我在我的项目中切换到基于类的视图,因为它们的重复代码较少,我无法弄清楚如何将对象传递给模板。默认情况下,使用详细视图会传递对象,这对于访问它的直接属性很合适,但我的对象上有标记,这些标记通过扩展定义并通过该扩展的功能访问。在我以旧的基于函数的视图中,我将获取标记列表并将其传递给模板,如下所示:

  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:", " }}

对它不起作用。感谢

2 个答案:

答案 0 :(得分:2)

您可以覆盖get_context_data并添加所需的任何其他上下文。这种方法经常在CBV中被覆盖

答案 1 :(得分:1)

在没有括号的情况下调用object.misc_tags.names将隐式调用该函数。或者像{dm03514那样使用get_context_data建议。

从模板中的django docs期间开始:

  

从技术上讲,当模板系统遇到一个点时,它会按以下顺序尝试以下查找:

     
      
  • 字典查找
  •   
  • 属性查找
  •   
  • 方法调用
  •   
  • 列表索引查找
  •