手动调用 Django 中基于类的泛型视图

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

我尝试过以下方法:

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)

Tracebacks:

在 /crm/categories/company/ 处的 ContentNotRenderedError 错误。在访问响应内容之前,必须先呈现它。

result = CategoryTypes().__init__()
print result

打印:None

我怎样从另一个视图中调用它?我已经尝试了类中的每种方法和我能想到的调用方式。

2个回答

43
第一种方式 -- CategoryTypes.as_view()(self.request) -- 是正确的。问题在于,如果你的视图返回一个TemplateResponse,它的render方法不会自动调用。
因此,如果您需要访问响应的内容,请首先调用render()

这就是我所看到的确切行为。当从Web服务器调用视图时,我不会在响应对象上调用render方法,那么手动调用它有什么区别,使其成为必要的呢? - Tim Saylor
根据文档所述,TemplateResponse旨在允许装饰器和中间件在渲染之前修改响应(例如更改模板和上下文),因此直到稍后才会进行渲染(详细信息请参阅这里)。 - Ismail Badawi
@TimSaylor 特别是,渲染发生在这里:https://github.com/django/django/blob/master/django/core/handlers/base.py#L134-139 - Ismail Badawi

1

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接