“Django/docs/3.0.x/ref/template-response”的版本间差异
(autoload) |
小 (Page commit) |
||
第1行: | 第1行: | ||
+ | {{DISPLAYTITLE:TemplateResponse 和 SimpleTemplateResponse — Django 文档}} | ||
<div id="module-django.template.response" class="section"> | <div id="module-django.template.response" class="section"> | ||
<span id="templateresponse-and-simpletemplateresponse"></span> | <span id="templateresponse-and-simpletemplateresponse"></span> | ||
− | = | + | = TemplateResponse 和 SimpleTemplateResponse = |
− | + | 标准 [[../request-response#django.http|HttpResponse]] 对象是静态结构。 它们在构建时提供了一个预渲染的内容块,虽然该内容可以修改,但它的形式并不容易执行修改。 | |
− | |||
− | |||
− | |||
− | + | 然而,有时允许装饰器或中间件在视图构造响应 ''之后修改响应'' 是有益的。 例如,您可能想要更改所使用的模板,或将附加数据放入上下文中。 | |
− | |||
− | |||
− | |||
− | TemplateResponse | + | TemplateResponse 提供了一种方法来做到这一点。 与基本的 [[../request-response#django.http|HttpResponse]] 对象不同,TemplateResponse 对象保留了视图提供的模板和上下文的详细信息以计算响应。 响应的最终输出在需要时才计算,在响应过程的后期。 |
− | [[../request-response#django.http| | ||
− | |||
− | |||
− | |||
<div id="simpletemplateresponse-objects" class="section"> | <div id="simpletemplateresponse-objects" class="section"> | ||
− | == | + | == SimpleTemplateResponse 物体 == |
− | ; ''class'' < | + | ; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">SimpleTemplateResponse</span></span> |
: | : | ||
第32行: | 第23行: | ||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">SimpleTemplateResponse.</span></span><span class="sig-name descname"><span class="pre">template_name</span></span></dt> |
− | <dd><p> | + | <dd><p>要呈现的模板的名称。 接受依赖于后端的模板对象(例如由 [[../../topics/templates#django.template.loader|get_template()]] 返回的对象)、模板名称或模板名称列表。</p> |
− | + | <p>示例:<code>['foo.html', 'path/to/bar.html']</code></p></dd></dl> | |
− | [[../../topics/templates#django.template.loader| | ||
− | |||
− | <p> | ||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">SimpleTemplateResponse.</span></span><span class="sig-name descname"><span class="pre">context_data</span></span></dt> |
− | <dd><p> | + | <dd><p>渲染模板时要使用的上下文数据。 它必须是 <code>dict</code>。</p> |
− | <code>dict</code> | + | <p>示例:<code>{'foo': 123}</code></p></dd></dl> |
− | <p> | ||
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">SimpleTemplateResponse.</span></span><span class="sig-name descname"><span class="pre">rendered_content</span></span> |
− | : | + | : 响应内容的当前呈现值,使用当前模板和上下文数据。 |
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">SimpleTemplateResponse.</span></span><span class="sig-name descname"><span class="pre">is_rendered</span></span> |
− | : | + | : 指示响应内容是否已呈现的布尔值。 |
第57行: | 第44行: | ||
=== 方法 === | === 方法 === | ||
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">SimpleTemplateResponse.</span></span><span class="sig-name descname"><span class="pre">__init__</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">template</span></span>'', ''<span class="n"><span class="pre">context</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">content_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">status</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">charset</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">using</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>''<span class="sig-paren">)</span> |
− | : | + | : 使用给定的模板、上下文、内容类型、HTTP 状态和字符集实例化 [[#django.template.response.SimpleTemplateResponse|SimpleTemplateResponse]] 对象。 |
;; <code>template</code> | ;; <code>template</code> | ||
− | ;: | + | ;: 依赖于后端的模板对象(例如由 [[../../topics/templates#django.template.loader|get_template()]] 返回的对象)、模板名称或模板名称列表。 |
;; <code>context</code> | ;; <code>context</code> | ||
− | ;: | + | ;: 要添加到模板上下文的 <code>dict</code> 值。 默认情况下,这是一个空字典。 |
;; <code>content_type</code> | ;; <code>content_type</code> | ||
− | ;: | + | ;: HTTP <code>Content-Type</code> 标头中包含的值,包括 MIME 类型规范和字符集编码。 如果指定了 <code>content_type</code>,则使用其值。 否则,使用 <code>'text/html'</code>。 |
;; <code>status</code> | ;; <code>status</code> | ||
− | ;: | + | ;: 响应的 HTTP 状态代码。 |
;; <code>charset</code> | ;; <code>charset</code> | ||
− | ;: | + | ;: 响应将在其中编码的字符集。 如果没有给出,它将从 <code>content_type</code> 中提取,如果不成功,将使用 [[#id1|:setting:`DEFAULT_CHARSET`]] 设置。 |
;; <code>using</code> | ;; <code>using</code> | ||
− | ;: | + | ;: 这 [[#id3|:setting:`名称 `]] 用于加载模板的模板引擎。 |
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">SimpleTemplateResponse.</span></span><span class="sig-name descname"><span class="pre">resolve_context</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">context</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>预处理将用于渲染模板的上下文数据。 接受上下文数据的 <code>dict</code>。 默认情况下,返回相同的 <code>dict</code>。</p> |
− | + | <p>重写此方法以自定义上下文。</p></dd></dl> | |
− | <code>dict</code> | ||
− | <p> | ||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">SimpleTemplateResponse.</span></span><span class="sig-name descname"><span class="pre">resolve_template</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">template</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>解析用于渲染的模板实例。 接受依赖于后端的模板对象(例如由 [[../../topics/templates#django.template.loader|get_template()]] 返回的对象)、模板名称或模板名称列表。</p> |
− | + | <p>返回要呈现的后端相关模板对象实例。</p> | |
− | [[../../topics/templates#django.template.loader| | + | <p>重写此方法以自定义模板加载。</p></dd></dl> |
− | |||
− | <p> | ||
− | <p> | ||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">SimpleTemplateResponse.</span></span><span class="sig-name descname"><span class="pre">add_post_render_callback</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>添加将在渲染发生后调用的回调。 此钩子可用于将某些处理操作(例如缓存)推迟到渲染发生之后。</p> |
− | + | <p>如果 [[#django.template.response.SimpleTemplateResponse|SimpleTemplateResponse]] 已经被渲染,回调将被立即调用。</p> | |
− | + | <p>调用时,回调将传递一个参数 - 呈现的 [[#django.template.response.SimpleTemplateResponse|SimpleTemplateResponse]] 实例。</p> | |
− | <p> | + | <p>如果回调返回的值不是 <code>None</code>,这将用作响应而不是原始响应对象(并将传递给下一个渲染后回调等)</p></dd></dl> |
− | |||
− | |||
− | <p> | ||
− | |||
− | |||
− | <p> | ||
− | |||
− | |||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">SimpleTemplateResponse.</span></span><span class="sig-name descname"><span class="pre">render</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>将 <code>response.content</code> 设置为 [[#django.template.response.SimpleTemplateResponse.rendered_content|SimpleTemplateResponse.rendered_content]] 获得的结果,运行所有渲染后回调,并返回结果响应对象。</p> |
− | [[#django.template.response.SimpleTemplateResponse.rendered_content| | + | <p><code>render()</code> 只会在第一次被调用时产生效果。 在后续调用中,它将返回从第一次调用中获得的结果。</p></dd></dl> |
− | |||
− | <p><code>render()</code> | ||
− | |||
第117行: | 第88行: | ||
<div id="templateresponse-objects" class="section"> | <div id="templateresponse-objects" class="section"> | ||
− | == | + | == TemplateResponse 物体 == |
− | ; ''class'' < | + | ; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TemplateResponse</span></span> |
− | : <code>TemplateResponse</code> | + | : <code>TemplateResponse</code> 是 [[#django.template.response.SimpleTemplateResponse|SimpleTemplateResponse]] 的子类,它知道当前的 [[../request-response#django.http|HttpRequest]]。 |
− | <div id=" | + | <div id="id5" class="section"> |
=== 方法 === | === 方法 === | ||
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">TemplateResponse.</span></span><span class="sig-name descname"><span class="pre">__init__</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">request</span></span>'', ''<span class="n"><span class="pre">template</span></span>'', ''<span class="n"><span class="pre">context</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">content_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">status</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">charset</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">using</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>''<span class="sig-paren">)</span> |
− | : | + | : 使用给定的请求、模板、上下文、内容类型、HTTP 状态和字符集实例化 [[#django.template.response.TemplateResponse|TemplateResponse]] 对象。 |
;; <code>request</code> | ;; <code>request</code> | ||
− | ;: | + | ;: [[../request-response#django.http|HttpRequest]] 实例。 |
;; <code>template</code> | ;; <code>template</code> | ||
− | ;: | + | ;: 依赖于后端的模板对象(例如由 [[../../topics/templates#django.template.loader|get_template()]] 返回的对象)、模板名称或模板名称列表。 |
;; <code>context</code> | ;; <code>context</code> | ||
− | ;: | + | ;: 要添加到模板上下文的 <code>dict</code> 值。 默认情况下,这是一个空字典。 |
;; <code>content_type</code> | ;; <code>content_type</code> | ||
− | ;: | + | ;: HTTP <code>Content-Type</code> 标头中包含的值,包括 MIME 类型规范和字符集编码。 如果指定了 <code>content_type</code>,则使用其值。 否则,使用 <code>'text/html'</code>。 |
;; <code>status</code> | ;; <code>status</code> | ||
− | ;: | + | ;: 响应的 HTTP 状态代码。 |
;; <code>charset</code> | ;; <code>charset</code> | ||
− | ;: | + | ;: 响应将在其中编码的字符集。 如果没有给出,它将从 <code>content_type</code> 中提取,如果不成功,将使用 [[#id6|:setting:`DEFAULT_CHARSET`]] 设置。 |
;; <code>using</code> | ;; <code>using</code> | ||
− | ;: | + | ;: 这 [[#id8|:setting:`名称 `]] 用于加载模板的模板引擎。 |
第149行: | 第120行: | ||
<div id="the-rendering-process" class="section"> | <div id="the-rendering-process" class="section"> | ||
− | == | + | == 渲染过程 == |
− | + | 在将 [[#django.template.response.TemplateResponse|TemplateResponse]] 实例返回给客户端之前,它必须被渲染。 渲染过程采用模板和上下文的中间表示,并将其转换为可以提供给客户端的最终字节流。 | |
− | |||
− | |||
− | |||
− | + | <code>TemplateResponse</code> 在三种情况下会被渲染: | |
− | |||
− | * | + | * 当 <code>TemplateResponse</code> 实例被显式渲染时,使用 [[#django.template.response.SimpleTemplateResponse.render|SimpleTemplateResponse.render()]] 方法。 |
− | * | + | * 通过分配<code>response.content</code>明确设置响应的内容时。 |
− | * | + | * 在通过模板响应中间件之后,但在通过响应中间件之前。 |
− | + | <code>TemplateResponse</code> 只能渲染一次。 第一次调用 [[#django.template.response.SimpleTemplateResponse.render|SimpleTemplateResponse.render()]] 设置响应的内容; 后续渲染调用不会更改响应内容。 | |
− | [[#django.template.response.SimpleTemplateResponse.render| | ||
− | |||
− | + | 但是,当显式分配 <code>response.content</code> 时,将始终应用更改。 如果要强制重新渲染内容,可以重新评估渲染的内容,并手动分配响应的内容: | |
− | |||
− | |||
− | |||
<div class="highlight-default notranslate"> | <div class="highlight-default notranslate"> | ||
第176行: | 第138行: | ||
<div class="highlight"> | <div class="highlight"> | ||
− | < | + | <syntaxhighlight lang="python"># Set up a rendered TemplateResponse |
− | + | >>> from django.template.response import TemplateResponse | |
− | + | >>> t = TemplateResponse(request, 'original.html', {}) | |
− | + | >>> t.render() | |
− | + | >>> print(t.content) | |
Original content | Original content | ||
# Re-rendering doesn't change content | # Re-rendering doesn't change content | ||
− | + | >>> t.template_name = 'new.html' | |
− | + | >>> t.render() | |
− | + | >>> print(t.content) | |
Original content | Original content | ||
# Assigning content does change, no render() call required | # Assigning content does change, no render() call required | ||
− | + | >>> t.content = t.rendered_content | |
− | + | >>> print(t.content) | |
− | New content</ | + | New content</syntaxhighlight> |
</div> | </div> | ||
第199行: | 第161行: | ||
<div id="post-render-callbacks" class="section"> | <div id="post-render-callbacks" class="section"> | ||
− | === | + | === 渲染后回调 === |
− | + | 某些操作(例如缓存)无法在未渲染的模板上执行。 它们必须在完全完整且呈现的响应上执行。 | |
− | |||
− | |||
− | + | 如果您使用的是中间件,则可以这样做。 中间件提供了多种机会来处理退出视图时的响应。 如果您将行为放在响应中间件中,则保证在模板渲染发生后执行。 | |
− | |||
− | |||
− | |||
− | + | 但是,如果您使用装饰器,则不存在相同的机会。 装饰器中定义的任何行为都会立即处理。 | |
− | |||
− | + | 为了弥补这一点(以及任何其他类似的用例),[[#django.template.response.TemplateResponse|TemplateResponse]] 允许您注册将在渲染完成时调用的回调。 使用此回调,您可以将关键处理推迟到可以保证呈现的内容可用的时间点。 | |
− | [[#django.template.response.TemplateResponse| | ||
− | |||
− | |||
− | |||
− | + | 要定义渲染后回调,请定义一个接受单个参数(响应)的函数,并将该函数注册到模板响应: | |
− | |||
− | |||
<div class="highlight-default notranslate"> | <div class="highlight-default notranslate"> | ||
第227行: | 第177行: | ||
<div class="highlight"> | <div class="highlight"> | ||
− | < | + | <syntaxhighlight lang="python">from django.template.response import TemplateResponse |
def my_render_callback(response): | def my_render_callback(response): | ||
第239行: | 第189行: | ||
response.add_post_render_callback(my_render_callback) | response.add_post_render_callback(my_render_callback) | ||
# Return the response | # Return the response | ||
− | return response</ | + | return response</syntaxhighlight> |
</div> | </div> | ||
</div> | </div> | ||
− | <code>my_render_callback()</code> | + | <code>my_render_callback()</code> 将在 <code>mytemplate.html</code> 渲染后调用,并将提供完全渲染的 [[#django.template.response.TemplateResponse|TemplateResponse]] 实例作为参数。 |
− | |||
− | [[#django.template.response.TemplateResponse| | ||
− | + | 如果模板已经被渲染,回调将被立即调用。 | |
− | |||
第257行: | 第204行: | ||
<div id="using-templateresponse-and-simpletemplateresponse" class="section"> | <div id="using-templateresponse-and-simpletemplateresponse" class="section"> | ||
− | == | + | == 使用 TemplateResponse 和 SimpleTemplateResponse == |
− | + | [[#django.template.response.TemplateResponse|TemplateResponse]] 对象可以在任何可以使用普通 [[../request-response#django.http|django.http.HttpResponse]] 的地方使用。 它也可以用作调用 [[../../topics/http/shortcuts#django.shortcuts|render()]] 的替代方法。 | |
− | [[../request-response#django.http| | ||
− | |||
− | + | 例如,以下视图返回带有模板和包含查询集的上下文的 [[#django.template.response.TemplateResponse|TemplateResponse]]: | |
− | |||
<div class="highlight-default notranslate"> | <div class="highlight-default notranslate"> | ||
第270行: | 第214行: | ||
<div class="highlight"> | <div class="highlight"> | ||
− | < | + | <syntaxhighlight lang="python">from django.template.response import TemplateResponse |
def blog_index(request): | def blog_index(request): | ||
− | return TemplateResponse(request, 'entry_list.html', {'entries': Entry.objects.all()})</ | + | return TemplateResponse(request, 'entry_list.html', {'entries': Entry.objects.all()})</syntaxhighlight> |
</div> | </div> | ||
第282行: | 第226行: | ||
</div> | </div> | ||
+ | <div class="clearer"> | ||
− | [[Category:Django 3.0.x | + | |
+ | |||
+ | </div> | ||
+ | |||
+ | [[Category:Django 3.0.x 文档]] |
2021年10月31日 (日) 04:10的最新版本
TemplateResponse 和 SimpleTemplateResponse
标准 HttpResponse 对象是静态结构。 它们在构建时提供了一个预渲染的内容块,虽然该内容可以修改,但它的形式并不容易执行修改。
然而,有时允许装饰器或中间件在视图构造响应 之后修改响应 是有益的。 例如,您可能想要更改所使用的模板,或将附加数据放入上下文中。
TemplateResponse 提供了一种方法来做到这一点。 与基本的 HttpResponse 对象不同,TemplateResponse 对象保留了视图提供的模板和上下文的详细信息以计算响应。 响应的最终输出在需要时才计算,在响应过程的后期。
SimpleTemplateResponse 物体
- class SimpleTemplateResponse
属性
- SimpleTemplateResponse.template_name
要呈现的模板的名称。 接受依赖于后端的模板对象(例如由 get_template() 返回的对象)、模板名称或模板名称列表。
示例:
['foo.html', 'path/to/bar.html']
- SimpleTemplateResponse.context_data
渲染模板时要使用的上下文数据。 它必须是
dict
。示例:
{'foo': 123}
- SimpleTemplateResponse.rendered_content
- 响应内容的当前呈现值,使用当前模板和上下文数据。
- SimpleTemplateResponse.is_rendered
- 指示响应内容是否已呈现的布尔值。
方法
- SimpleTemplateResponse.__init__(template, context=None, content_type=None, status=None, charset=None, using=None)
- 使用给定的模板、上下文、内容类型、HTTP 状态和字符集实例化 SimpleTemplateResponse 对象。
template
- 依赖于后端的模板对象(例如由 get_template() 返回的对象)、模板名称或模板名称列表。
context
- 要添加到模板上下文的
dict
值。 默认情况下,这是一个空字典。 content_type
- HTTP
Content-Type
标头中包含的值,包括 MIME 类型规范和字符集编码。 如果指定了content_type
,则使用其值。 否则,使用'text/html'
。 status
- 响应的 HTTP 状态代码。
charset
- 响应将在其中编码的字符集。 如果没有给出,它将从
content_type
中提取,如果不成功,将使用 :setting:`DEFAULT_CHARSET` 设置。 using
- 这 :setting:`名称 ` 用于加载模板的模板引擎。
- SimpleTemplateResponse.resolve_context(context)
预处理将用于渲染模板的上下文数据。 接受上下文数据的
dict
。 默认情况下,返回相同的dict
。重写此方法以自定义上下文。
- SimpleTemplateResponse.resolve_template(template)
解析用于渲染的模板实例。 接受依赖于后端的模板对象(例如由 get_template() 返回的对象)、模板名称或模板名称列表。
返回要呈现的后端相关模板对象实例。
重写此方法以自定义模板加载。
- SimpleTemplateResponse.add_post_render_callback()
添加将在渲染发生后调用的回调。 此钩子可用于将某些处理操作(例如缓存)推迟到渲染发生之后。
如果 SimpleTemplateResponse 已经被渲染,回调将被立即调用。
调用时,回调将传递一个参数 - 呈现的 SimpleTemplateResponse 实例。
如果回调返回的值不是
None
,这将用作响应而不是原始响应对象(并将传递给下一个渲染后回调等)
- SimpleTemplateResponse.render()
将
response.content
设置为 SimpleTemplateResponse.rendered_content 获得的结果,运行所有渲染后回调,并返回结果响应对象。render()
只会在第一次被调用时产生效果。 在后续调用中,它将返回从第一次调用中获得的结果。
TemplateResponse 物体
- class TemplateResponse
TemplateResponse
是 SimpleTemplateResponse 的子类,它知道当前的 HttpRequest。
方法
- TemplateResponse.__init__(request, template, context=None, content_type=None, status=None, charset=None, using=None)
- 使用给定的请求、模板、上下文、内容类型、HTTP 状态和字符集实例化 TemplateResponse 对象。
request
- HttpRequest 实例。
template
- 依赖于后端的模板对象(例如由 get_template() 返回的对象)、模板名称或模板名称列表。
context
- 要添加到模板上下文的
dict
值。 默认情况下,这是一个空字典。 content_type
- HTTP
Content-Type
标头中包含的值,包括 MIME 类型规范和字符集编码。 如果指定了content_type
,则使用其值。 否则,使用'text/html'
。 status
- 响应的 HTTP 状态代码。
charset
- 响应将在其中编码的字符集。 如果没有给出,它将从
content_type
中提取,如果不成功,将使用 :setting:`DEFAULT_CHARSET` 设置。 using
- 这 :setting:`名称 ` 用于加载模板的模板引擎。
渲染过程
在将 TemplateResponse 实例返回给客户端之前,它必须被渲染。 渲染过程采用模板和上下文的中间表示,并将其转换为可以提供给客户端的最终字节流。
TemplateResponse
在三种情况下会被渲染:
- 当
TemplateResponse
实例被显式渲染时,使用 SimpleTemplateResponse.render() 方法。 - 通过分配
response.content
明确设置响应的内容时。 - 在通过模板响应中间件之后,但在通过响应中间件之前。
TemplateResponse
只能渲染一次。 第一次调用 SimpleTemplateResponse.render() 设置响应的内容; 后续渲染调用不会更改响应内容。
但是,当显式分配 response.content
时,将始终应用更改。 如果要强制重新渲染内容,可以重新评估渲染的内容,并手动分配响应的内容:
渲染后回调
某些操作(例如缓存)无法在未渲染的模板上执行。 它们必须在完全完整且呈现的响应上执行。
如果您使用的是中间件,则可以这样做。 中间件提供了多种机会来处理退出视图时的响应。 如果您将行为放在响应中间件中,则保证在模板渲染发生后执行。
但是,如果您使用装饰器,则不存在相同的机会。 装饰器中定义的任何行为都会立即处理。
为了弥补这一点(以及任何其他类似的用例),TemplateResponse 允许您注册将在渲染完成时调用的回调。 使用此回调,您可以将关键处理推迟到可以保证呈现的内容可用的时间点。
要定义渲染后回调,请定义一个接受单个参数(响应)的函数,并将该函数注册到模板响应:
my_render_callback()
将在 mytemplate.html
渲染后调用,并将提供完全渲染的 TemplateResponse 实例作为参数。
如果模板已经被渲染,回调将被立即调用。
使用 TemplateResponse 和 SimpleTemplateResponse
TemplateResponse 对象可以在任何可以使用普通 django.http.HttpResponse 的地方使用。 它也可以用作调用 render() 的替代方法。
例如,以下视图返回带有模板和包含查询集的上下文的 TemplateResponse: