手动调用基于类的通用视图

Posted

技术标签:

【中文标题】手动调用基于类的通用视图【英文标题】:Manually calling a class based generic view 【发布时间】:2011-11-07 16:54:19 【问题描述】:

我目前正在尝试从另一个基于类的通用视图中调用基于类的通用视图,但似乎无法正确执行。

我尝试过的方法:

result = CategoryTypes.as_view()  # The same way you put it in the urlconf
print result

打印:<function CategoryTypes at 0x92bd924>

CategoryTypes.as_view()(self.request)
# &
CategoryTypes().dispatch(self.request)

追溯:

ContentNotRenderedError at /crm/categories/company/ The response content must be rendered before it can be accessed.

result = CategoryTypes().__init__()
print result

打印:None

如何从另一个角度调用它?我已经认真尝试了课堂上的所有方法以及我能想到的调用方式。

【问题讨论】:

【参考方案1】:

第一种方式——CategoryTypes.as_view()(self.request)——是对的。问题是如果你的视图返回一个TemplateResponse,它的render方法不会被自动调用。

因此,如果您需要访问响应的内容,请先调用render()

【讨论】:

这是我看到的确切行为。当从 Web 服务器调用视图时,我不会在响应对象上调用 render,那么手动调用它时有什么区别? @TimSaylor From the docs, TemplateResponse 旨在允许装饰器和中间件在响应呈现之前修改响应(例如更改模板和上下文),因此直到稍后才会呈现(详情@ 987654322@) @TimSaylor 特别是,渲染发生在这里:github.com/django/django/blob/master/django/core/handlers/…【参考方案2】:

或者您可以通过result.rendered_content 直接访问内容。在进行此操作之前,请确保您在传递到视图之前将会话设置为您的请求:

self.request.session = 
CategoryTypes.as_view()(self.request)

【讨论】:

以上是关于手动调用基于类的通用视图的主要内容,如果未能解决你的问题,请参考以下文章

基于 Django 类的通用视图和 ModelForms

Django 基于类的通用视图和身份验证

基于 Django 类的视图和通用视图详细信息使用

如何在基于类的通用视图中访问 RequestContext?

如何根据 Django 中当前基于类的通用视图模型向模板加载器添加路径

Django - 基于类的通用视图 - “没有要重定向到的 URL”