我有一个特别沉重的观点,可能需要多次将表单发布回自身,但我需要立即使用标题。
有没有办法首先返回模板的标题部分?例如我的观点返回的内容如下:
return HttpResponse(Template('
{% extends "base.html" %}
{% block content %} FOO {% endblock %}
'))
理想情况下,我希望能够做到这样的事情:
partialResponse = request.renderUntilBlock('content')
# lots of work
return partialResponse.extend(Template('
{% block content %} FOO {% endblock %}
'))
更新:显然PHP的结构不同,但这是我希望模仿的:
<?php
echo '<html><head><title>Hi!</title</head><body>';
ob_flush(); flush();
# header has now been output to the client
# do lots of work
echo '<h1>done</h1></body></html>';
?>
答案 0 :(得分:0)
是的,有可能。您需要做的是将每个渲染捕获为字符串,然后连接字符串以形成响应的完整内容。
以下是低级方式:
from django.template import Context, Template
t1 = Template("My name is {{ my_name }}.")
c1 = Context({"my_name": "Adrian"})
s = t.render(c1)
t2 = Template("My name is {{ my_name }}.")
c2 = Context({"my_name": "Adrian"}) # You could also use the same context with each template if you wanted.
s += t.render(c2)
return HttpResponse(s)
但是,如果你出于性能原因想要这样做,我会确保比较一次渲染所有时间与渲染片段所需的时间。我认为一次渲染是最好的方法。在完成所有事情之前,您无法返回响应。
答案 1 :(得分:0)
据我所知,没有办法直接这样做。最好的办法是简单地返回一个只包含标题的页面和一个通过AJAX获取页面其余部分数据的javascript函数。
答案 2 :(得分:0)
没有完全测试这个,但这应该根据文档工作。
from django.template import Context, Template
def responder():
yield '' # to make sure the header is sent
# do all your work
t = Template('''
{% extends "base.html" %}
{% block content %} FOO {% endblock %}
''')
yield t.render(Context({}))
return HttpResponse(responder())