【问题标题】: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

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

【问题讨论】:

    标签: python django django-generic-views


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-14
      • 2013-02-04
      • 1970-01-01
      • 2016-08-06
      • 2012-11-15
      • 1970-01-01
      • 2015-02-03
      相关资源
      最近更新 更多