TemplateResponse
and SimpleTemplateResponse
¶HttpResponse
对象是静态结构。它们在构建时提供了一个预渲染内容块,虽然可以修改该内容,但其形式不便于执行修改。
然而,有时允许修饰器或中间件修改响应是有益的。 之后 它是由视图构建的。例如,您可能希望更改所使用的模板,或者将其他数据放入上下文中。
TemplateResponse提供了一种这样做的方法。不同于基本 HttpResponse
对象,templateResponse对象保留视图提供的用于计算响应的模板和上下文的详细信息。响应的最终输出直到在响应过程的后面需要时才会计算出来。
SimpleTemplateResponse
对象¶要呈现的模板的名称。接受后端依赖模板对象(例如由 get_template()
)模板的名称或模板名称列表。
例子: ['foo.html', 'path/to/bar.html']
响应内容的当前呈现值,使用当前模板和上下文数据。
指示响应内容是否已呈现的布尔值。
实例化A SimpleTemplateResponse
具有给定模板、上下文、内容类型、HTTP状态和字符集的对象。
template
依赖后端的模板对象(例如由 get_template()
)模板的名称或模板名称列表。
context
A dict
要添加到模板上下文中的值。默认情况下,这是一个空字典。
content_type
HTTP中包含的值 Content-Type
头,包括mime类型规范和字符集编码。如果 content_type
指定,然后使用其值。否则, 'text/html'
使用。
status
响应的HTTP状态代码。
charset
将在其中对响应进行编码的字符集。如果没有给出,它将从 content_type
如果不成功, DEFAULT_CHARSET
将使用设置。
using
这个 NAME
用于加载模板的模板引擎。
headers
A dict
要添加到响应的HTTP标头的。
预处理将用于呈现模板的上下文数据。接受一 dict
上下文数据的。默认情况下,返回相同的 dict
.
重写此方法以便自定义上下文。
解析用于呈现的模板实例。接受后端依赖模板对象(例如由 get_template()
)模板的名称或模板名称列表。
返回要呈现的依赖于后端的模板对象实例。
重写此方法以自定义模板加载。
添加一个将在呈现发生后调用的回调。这个钩子可以用来延迟某些处理操作(如缓存),直到渲染完成。
如果 SimpleTemplateResponse
已呈现,将立即调用回调。
调用时,回调将传递一个参数——呈现 SimpleTemplateResponse
实例。
如果回调返回的值不是 None
,这将用作响应而不是原始响应对象(并将传递到下一个呈现后回调等)。
集合 response.content
结果由 SimpleTemplateResponse.rendered_content
,运行所有呈现后回调,并返回结果响应对象。
render()
只有在第一次调用时才会有效果。在随后的调用中,它将返回从第一个调用获得的结果。
TemplateResponse
对象¶TemplateResponse
是的子类 SimpleTemplateResponse
知道现在的情况 HttpRequest
.
实例化A TemplateResponse
具有给定请求、模板、上下文、内容类型、HTTP状态和字符集的对象。
request
安 HttpRequest
实例。
template
依赖后端的模板对象(例如由 get_template()
)模板的名称或模板名称列表。
context
A dict
要添加到模板上下文中的值。默认情况下,这是一个空字典。
content_type
HTTP中包含的值 Content-Type
头,包括mime类型规范和字符集编码。如果 content_type
指定,然后使用其值。否则, 'text/html'
使用。
status
响应的HTTP状态代码。
charset
将在其中对响应进行编码的字符集。如果没有给出,它将从 content_type
如果不成功, DEFAULT_CHARSET
将使用设置。
using
这个 NAME
用于加载模板的模板引擎。
headers
A dict
要添加到响应的HTTP标头的。
之前 TemplateResponse
实例可以返回到客户端,必须进行呈现。呈现过程采用模板和上下文的中间表示形式,并将其转换为可以提供给客户机的最终字节流。
在三种情况下 TemplateResponse
将呈现:
当 TemplateResponse
实例是显式呈现的,使用 SimpleTemplateResponse.render()
方法。
当通过赋值显式设置响应的内容时 response.content
.
在传递模板响应中间件之后,但在传递响应中间件之前。
A TemplateResponse
只能呈现一次。第一次调用 SimpleTemplateResponse.render()
设置响应的内容;随后的呈现调用不会更改响应内容。
但是,当 response.content
显式分配,则始终应用更改。如果要强制重新呈现内容,可以重新评估呈现的内容,并手动分配响应的内容:
# Set up a rendered TemplateResponse
>>> from django.template.response import TemplateResponse
>>> t = TemplateResponse(request, "original.html", {})
>>> t.render()
>>> print(t.content)
Original content
# Re-rendering doesn't change content
>>> t.template_name = "new.html"
>>> t.render()
>>> print(t.content)
Original content
# Assigning content does change, no render() call required
>>> t.content = t.rendered_content
>>> print(t.content)
New content
某些操作(如缓存)不能在未引用的模板上执行。它们必须在完全完整的响应上执行。
如果您使用中间件,您可以做到这一点。中间件提供多种机会在退出视图时处理响应。如果将行为放在响应中间件中,则保证在模板呈现发生后执行。
但是,如果您使用的是修饰符,则不存在相同的机会。修饰符中定义的任何行为都将立即处理。
为了补偿这一点(以及任何其他类似的用例), TemplateResponse
允许您注册在渲染完成后将调用的回调。使用此回调,可以将关键处理推迟到可以保证呈现内容可用的时间点。
要定义呈现后回调,请定义一个接受单个参数(response)的函数,并用模板响应注册该函数:
from django.template.response import TemplateResponse
def my_render_callback(response):
# Do content-sensitive processing
do_post_processing()
def my_view(request):
# Create a response
response = TemplateResponse(request, "mytemplate.html", {})
# Register the callback
response.add_post_render_callback(my_render_callback)
# Return the response
return response
my_render_callback()
将在 mytemplate.html
已呈现,并将提供完整呈现 TemplateResponse
实例作为参数。
如果模板已呈现,则将立即调用回调。
TemplateResponse
和 SimpleTemplateResponse
¶A TemplateResponse
对象可用于 django.http.HttpResponse
可以使用。它也可以作为调用的替代方法 render()
.
例如,下面的视图返回一个 TemplateResponse
使用模板和包含查询集的上下文:
from django.template.response import TemplateResponse
def blog_index(request):
return TemplateResponse(
request, "entry_list.html", {"entries": Entry.objects.all()}
)
12月 18, 2023