2012-01-23 6 views
0

正しいと見なされる/部分テンプレートをajaxのPOSTリクエストに返す際の落とし穴がありますか?例えばDjangoの部分テンプレートの応答

if request.is_ajax: 
    # response is just the form 
    return render(request, 'contact/fields.html', {'form':form}) 
+0

部分的には、それはちょっとしたHTMLのことですか? doctypeまたはタグなしで? – dm03514

+0

はい、正しいです。何かが好きです

a bunch of html

答えて

2

最も典型的なアプローチは、JSONを返すと、あなたはJSONデータからクライアント側に必要なものは何でもHTML contructingされます。しかし、これは振舞いと提示が混ざり合っていると主張でき、HTMLをはっきりと区別する方がよいでしょう。

フリップサイドでは、HTMLのブロックを返すのは、あなたが得ることのできる「RESTful」の極北です。純粋なRESTの考え方では、ビューは標準的で再利用可能なコンテナ(JSONやXMLなど)にデータを戻す必要があります。後でiOS/Android/WP7 /などにフォームをプルする必要がある場合は、 JSON/XMLはまさにあなたに役立ちますが、HTMLは事実上役に立たないのです。

私は両方の議論を容易に見ることができますが、私はどちらかと言えば必ずしも正しいものではないと思います。最終的には、あなたのアプリに最適なものと、あなたにとって「正しい」ものを作る必要があると思います。あなたの特定の状況のた​​めに、より保守的で拡張可能なものを考えてください。

+0

+1はDjango 1.4でクライアント側のテストを書くのが普通になるはずです。ジェネリックでRESTfulな方法でJSONデータを返すことによって確実に処理されます。 –

0

私はアヤックス復帰応答のほとんどは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要素を返送し、下部の表に挿入します。右から左にスライドします。

テンプレート全体を送り返すと、画面全体が点滅し、滑らかなアニメーションが得られません。とにかくそれは私の理解です。

+0

私は何をしようとしていますが、jsonではなくhtmlとして返します。 –

0

私はこれをjQuery Dialogsのいくつかに対して行っています。ダイアログの内容はAJAXリクエストによって要求され、コンテンツはサーバー側でレンダリングされてから返され、表示されます。これまで私はそれに問題はなかった。

0

個人的な経験から、私は落とし穴がないと言うことができます。私はあまり良いデザインパターンではありません(良い練習ではありません)。私はかなり高負荷のプロジェクトでこれをやっていました。

1

フォーム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 %} 
関連する問題