web-dev-qa-db-ja.com

Ajax呼び出し後にDjangoテンプレートを使用してJSONオブジェクトをレンダリングする

Ajax in Django の最適な方法を理解しようとしています。あちこちで資料を読むことで、一般的なプロセスは次のようになりました。

  1. JavaScript ライブラリ(たとえば jQuery )を使用してAjax呼び出しを定式化し、Djangoで呼び出しをキャッチして渡すURLパターンを設定しますビュー関数に

  2. Python ビュー関数で、目的のオブジェクトを取得し、JSON形式または同様の形式でクライアントに送り返します(組み込みのシリアライザーモジュールを使用するか、または simplejson

  3. jSONデータを受信して​​解析するJavaScriptのコールバック関数を定義し、表示するために必要なHTMLを作成します。最後に、JavaScriptスクリプトはHTMLをどこにでも配置します。

今、私がまだ得ていないのは、how are Djangoこれに関連するテンプレートですか?どうやら、私たちは利用していない理想的には、データを繰り返し処理してHTMLブロックを作成できるように、JSONオブジェクトとテンプレート名を返すのがいいと思っていました。 ...

この方向に行くことがわかった唯一のリソースは this snippet(769) ですが、まだ試していません。明らかに、この場合に発生するのは、結果のHTMLがすべてサーバー側で作成され、クライアントに渡されることです。 JavaScriptコールバック関数は、適切な場所に表示するだけです。

これはパフォーマンスの問題を引き起こしますか?そうでない場合は、上記のスニペットを使用しなくても、フロントエンドの代わりにPythonを使用してバックエンドでHTMLを直接フォーマットしないのはなぜですか?

どうもありがとう!

UPDATE: snippet 942 を使用してください。これは上記の拡張バージョンであるためです!継承サポートが非常に機能することがわかりましたこの方が良い..

65
magicrebirth

ヴァイキングセグンドに感謝します!

私もデコレータを使うのが好きです:-)。しかしその間、私は上で言及したスニペットによって提案されたアプローチに従っています。ただ、代わりに スニペット番号942 を使用してください。これは元のバージョンの改良版です。仕組みは次のとおりです。

再利用できる便利なブロックを含む任意のサイズのテンプレート(「subtemplate.html」など)があるとします。

     ........
    <div id="results">          
        {% block results %}
            {% for el in items %}
                   <li>{{el|capfirst}}</li>
            {% endfor %}
        {% endblock %}      
    </div><br />
     ........

ビューファイルに上記のスニペットをインポートすることにより、テンプレート内の任意のブロックを簡単に参照できます。クールな機能は、テンプレート間の継承関係が考慮されることです。したがって、別のブロックなどを含むブロックを参照する場合、すべてが正常に機能するはずです。そのため、ajaxビューは次のようになります。

from Django.template import loader
# downloaded from djangosnippets.com[942]
from my_project.snippets.template import render_block_to_string

def ajax_view(request):
    # some random context
    context = Context({'items': range(100)})
    # passing the template_name + block_name + context
    return_str = render_block_to_string('standard/subtemplate.html', 'results', context)
    return HttpResponse(return_str)
25
magicrebirth

従来のレンダリングとAjaxレスポンスレンダリングに同じテンプレートを使用する方法を次に示します。

テンプレート:

<div  id="sortable">

{% include "admin/app/model/subtemplate.html" %}
</div>

含まれるテンプレート(別名:サブテンプレート):

<div id="results_listing">
{% if results %}
    {% for c in results %}
        .....
    {% endfor %}
{% else %}

Ajaxビュー:

@login_required
@render_to('admin/app/model/subtemplate.html')#annoying-decorator
def ajax_view(request):
    .....

    return { 
        "results":Model.objects.all(),
    }      

もちろん、render_to_responseを使用できます。しかし、私はそれらの迷惑なデコレータが好きです:D

13
vikingosegundo

Ajaxを使用してレンダリングされたHTMLのビットを返せず、必要な時点で既存のページに挿入できない理由はありません。必要に応じて、Djangoのテンプレートを使用してこのHTMLをレンダリングできます。

7
Daniel Roseman

Ajaxを実行しているとき、テンプレートを使用するとは思わない。テンプレートが存在するため、サーバー側で簡単に動的HTMLを生成できるため、HTML内にプログラミングフックがほとんどありません。

Ajaxの場合、JSONデータを渡し、Pythonで必要に応じてフォーマットできます。 HTML /ドキュメント要素は、JavaScriptライブラリなどによってJSONを使用してクライアント側で生成されます。クライアント側のjQuery。

サーバー側のHTMLから内部HTMLを置き換えるという非常に具体的なケースがある場合は、テンプレートを使用できますが、その場合はJSONが必要なのでしょうか。 Ajaxを介してHTMLページを照会し、内部または外部または任意のHTMLを変更できます。

6
Anurag Uniyal

テンプレートは、presentationを目的としています。フォーマットX(JSON、 [〜#〜] jsonp [〜#〜] 、XML、 [〜#〜] yaml [〜 #〜] 、* mlなど)はプレゼンテーションではないため、テンプレートは必要ありません。データをフォーマットXにシリアル化し、HttpResponseで返すだけです。

3
yfeldblum

テンプレートは確かにプレゼンテーション目的のためだけのものですが、サーバー側で実行するかクライアント側で実行するかは問題ではありません。すべては、アクションを実行している制御ロジックを、マークアップの作成だけを担当するビューロジックから分離することです。 JavaScript制御ロジックがHTMLのレンダリングまたは表示方法を処理する必要がある場合は、間違っている可能性がありますが、そのレンダリングロジックを別のオブジェクトまたは関数に分離し、レンダリングに必要なデータを渡すだけで、その後、あなたは大丈夫です。サーバー側でコントローラー、モデル、ビューを分離する方法を反映しています。

Githubプロジェクトを見てください: http://github.com/comolongo/Yz-Javascript-Django-Template-Compiler

Djangoテンプレートを最適化されたjavascript関数にコンパイルします。この関数は、渡すデータでプレゼンテーションhtmlを生成します。コンパイルされた関数は純粋なjavascriptであるため、他のライブラリに依存しません。実行時に解析されるのではなくコンパイルされ、文字列と変数はすべて、連結するだけでよいjavascript文字列に既に配置されているため、huge dom操作やスクリプト解析を行って最終的なプレゼンテーションを取得する必要がある手法に比べて速度が向上します。現時点では基本的なタグとフィルターのみがありますが、ほとんどの場合はこれで十分で、ユーザーが作成を開始するとタグが追加されますそれらへのリクエスト、またはプロジェクトへの貢献を開始します。

3
Weiss I Nicht

jquery.load()などを使用して、サーバーでHTMLを生成し、JavaScriptでDOMにロードできます。誰かがこれを呼んでいると思う[〜#〜] ajah [〜#〜]

1
Skylar Saveland

残念ながら、Djangoテンプレートはサーバー側でのみ実行されるように設計されています。 レンダリングするプロジェクトが少なくとも1つ Django Javascriptを使用するテンプレートがありますが、私はそれを使用したことがないため、どれだけ速く、十分にサポートされているか、最新であるかわかりませんです。これ以外に、サーバーでDjangoテンプレートを使用するか、テンプレートを使用せずにクライアントで動的要素を生成する必要があります。

0
Casebash