正しいと見なされる/部分テンプレートをajaxのPOSTリクエストに返す際の落とし穴がありますか?例えばDjangoの部分テンプレートの応答
:
if request.is_ajax:
# response is just the form
return render(request, 'contact/fields.html', {'form':form})
正しいと見なされる/部分テンプレートをajaxのPOSTリクエストに返す際の落とし穴がありますか?例えばDjangoの部分テンプレートの応答
:
if request.is_ajax:
# response is just the form
return render(request, 'contact/fields.html', {'form':form})
最も典型的なアプローチは、JSONを返すと、あなたはJSONデータからクライアント側に必要なものは何でもHTML contructingされます。しかし、これは振舞いと提示が混ざり合っていると主張でき、HTMLをはっきりと区別する方がよいでしょう。
フリップサイドでは、HTMLのブロックを返すのは、あなたが得ることのできる「RESTful」の極北です。純粋なRESTの考え方では、ビューは標準的で再利用可能なコンテナ(JSONやXMLなど)にデータを戻す必要があります。後でiOS/Android/WP7 /などにフォームをプルする必要がある場合は、 JSON/XMLはまさにあなたに役立ちますが、HTMLは事実上役に立たないのです。
私は両方の議論を容易に見ることができますが、私はどちらかと言えば必ずしも正しいものではないと思います。最終的には、あなたのアプリに最適なものと、あなたにとって「正しい」ものを作る必要があると思います。あなたの特定の状況のために、より保守的で拡張可能なものを考えてください。
+1はDjango 1.4でクライアント側のテストを書くのが普通になるはずです。ジェネリックでRESTfulな方法でJSONデータを返すことによって確実に処理されます。 –
私はアヤックス復帰応答のほとんどはDOM要素ではなくフォーム全体を返すと思います。
(例えば)
...
person = ''' <a href="/person/{0}" class="normalMenu">{1} {2}</a>'''.format(p.id, p.first_name, p.last_name)
q = simplejson.dumps({"person":person})
return HttpResponse(q, mimetype="application/json")
上記テンプレートに単純なDOM要素を返送し、下部の表に挿入します。右から左にスライドします。
テンプレート全体を送り返すと、画面全体が点滅し、滑らかなアニメーションが得られません。とにかくそれは私の理解です。
私は何をしようとしていますが、jsonではなくhtmlとして返します。 –
私はこれをjQuery Dialogsのいくつかに対して行っています。ダイアログの内容はAJAXリクエストによって要求され、コンテンツはサーバー側でレンダリングされてから返され、表示されます。これまで私はそれに問題はなかった。
個人的な経験から、私は落とし穴がないと言うことができます。私はあまり良いデザインパターンではありません(良い練習ではありません)。私はかなり高負荷のプロジェクトでこれをやっていました。
フォームPOSTリクエストでこれを試したことはありませんが、ページ全体をロードせずに部分的なHTMLをAJAX GETリクエストに戻してページの変更を行います。フォームリクエストでもうまくいくと思います(複数の異なるフォームのページでこのアプローチを使用するかどうかは現時点で実際に議論されています)。
正しいとすれば悪いデザインパターンではないと思います。これは、AJAX呼び出しであるかどうかに基づいて拡張される基本テンプレートを変更することで実現します。
簡単な例:
### view
base_template = "base.html"
if request.is_ajax():
base_template = "base-ajax.html"
return render_to_response(request, 'page.html', {'base_template': base_template})
### page.html
{% extends base_template %}
{% block main %}new page content{% endblock %}
### base.html
<html>
<!-- complete html page -->
...
{% block main %}this is what changes per page{% endblock %}
...
</html>
### base-ajax.html
{% block main %}this is what changes per page{% endblock %}
部分的には、それはちょっとしたHTMLのことですか? doctypeまたはタグなしで? – dm03514
はい、正しいです。何かが好きです