Django - 如何通过类视图将对象传递给模板?

0 投票
2 回答
2937 浏览
提问于 2025-04-18 02:02

我在我的项目中开始使用基于类的视图,主要是因为这样可以减少重复的代码。不过,我现在遇到一个问题,就是不知道怎么把一个对象传递给模板。默认情况下,使用详细视图会把对象传过去,这样可以直接访问对象的属性,这没问题。但是我的对象上有一些标签,这些标签是通过一个扩展定义的,需要通过那个扩展的一个函数来访问。在我以前的基于函数的视图中,我会获取标签的列表,然后像这样把它传递给模板,以便进行迭代:

  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)中经常被重写。

撰写回答