2011-03-04 5 views
3

私は何度もフォームを返す必要があるかもしれない特に重い見解を持っていますが、私はすぐにヘッダーが必要です。Djangoビューで最初にヘッダを返すことはできますか?

テンプレートのヘッダー部分が最初に返される方法はありますか?例えば

partialResponse = request.renderUntilBlock('content') 
# lots of work 
return partialResponse.extend(Template(' 
    {% block content %} FOO {% endblock %} 
')) 

更新:もちろん、PHPは異なる構造であるが、これは私がエミュレートするために望んでいるものです:

私のような何かを行うことができるようにしたい理想的

return HttpResponse(Template(' 
    {% extends "base.html" %} 
    {% block content %} FOO {% endblock %} 
')) 

:私の見解は次のように返します。

<?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

私は確信して私は、私はないと思うので、私は:)あなたは、コンテンツブロックまでレンダービューに戻り、戻りたいんです、理解してみましょう 'HttpResponse'それまでページを含みますポイントを表示し、ビューを残りのページのレンダリングを再開させますか?あなたはもちろんそれを直接行うことはできません。 – dappawit

+0

@dappawit質問を更新しました。それを明確にしたいと思います:) –

+0

さて、ページを1刻みでレンダリングできるようにしたいのですか?コンテンツブロックまでレンダリングした後、ビューに戻り、さらにレンダリングしてビューに戻ります。 – dappawit

答えて

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()) 
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) 

あなたはパフォーマンス上の理由から、これを行うにしたい場合は、私はそれがバラバラにレンダリングに対して一斉にレンダリングするのにかかる時間を比較することを確認します。私は一度にすべてをレンダリングするのが一般的に行く最良の方法だと思います。あなたはすべてのものがとにかくレンダリングされるまで、応答を返すことはできません。

+0

これは適切なトラックに見えますが、それでもページ全体を一度に配信しないのですか?私の質問の要点は、私の見解で仕事の遅れの前に、*最初にクライアント*にヘッダー*をレンダリングできることです。 –

+0

ああ、Djangoだけを使ってそれを行う方法はありません、あなたはAJAXルートに行く必要があります。 Djangoのレンダリングはサーバー上でレンダリングされており、ブラウザでのレンダリングとは関係ありません。 – dappawit

0

私が知る限り、これを直接行う方法はありません。あなたの最善の策は、ヘッダーとAJAX経由でページの残りのデータを取得するjavascript関数だけを持つページを返すことです。

+0

私はこれをajax経由でやりたくない理由は、このビューはフォームを何度も返さなければならないかもしれないので、すべてのフォーム処理をajax経由で行う必要があるからです。 –

+0

それから、デザインを考え直さなければならないかもしれませんか? – dappawit

+0

@Drew、@dappawit、もう一度PHPの例で質問を更新しました。 –

関連する問題