あなたはAJAXについて話している。AJAX は常に 3 つの部分を必要とします (技術的には 2 つだけです。Javascript は 2 つの役割を果たします)。
- クライアント (この場合は Javascript) がリクエストを行います
- サーバー (この場合は Django ビュー) がリクエストを処理し、レスポンスを返します
- クライアント (ここでも Javascript) は応答を受け取り、それに対して何かを行います
優先するフレームワークは指定されていませんが、なんらかの Javascript フレームワークなしで AJAX を実行するのは正気ではないため、jQuery を選択します。このコードは、任意の Javascript フレームワークに非常に簡単に適合させることができます。
$.getJSON('/url/to/ajax/view/', {foo: 'bar'}, function(data, jqXHR){
// do something with response
});
これは、GET 要求を URL に送信し、応答を JSON として自動的に解析して、ここで$.getJSON
渡された Javascript オブジェクトに変換する jQuery 便利なメソッドdata
です。最初のパラメーターはリクエストの送信先の URL です (詳細は後述します)。2 番目のパラメーターは、リクエストと共に送信する必要があるデータを含む Javascript オブジェクトです (必要がない場合は省略できます)。 3 番目のパラメーターは、成功時にサーバーからの応答を処理するためのコールバック関数です。したがって、この単純なコードは、上記のパート 1 と 3 をカバーしています。
次の部分はハンドラーです。この場合はもちろん Django ビューになります。ビューの唯一の要件は、JSON 応答を返す必要があることです。
from django.utils import simplejson
def my_ajax_view(request):
# do something
return HttpResponse(simplejson.dumps(some_data), mimetype='application/json')
このビューは、 required 以外の引数を取らないことに注意してくださいrequest
。これは少し哲学的な選択です。私見ですが、真の REST のやり方では、データは URL ではなく、リクエストと共に渡される必要がありますが、他のユーザーは同意しない場合があります。究極の選択はあなた次第です。
また、ここでは一般的な Python データ構造 (リスト、辞書など) に最適な Django の simplejson ライブラリを使用したことに注意してください。Django モデル インスタンスまたはクエリセットを返したい場合は、代わりに serializers ライブラリを使用する必要があります。
from django.core import serializers
...
data = serializers.serialize('json', some_instance_or_queryset)
return HttpResponse(data, mimetype='application/json')
これでビューができたので、あとはそれを Django の urlpatterns に結び付けて、Django がリクエストをルーティングする方法を認識できるようにするだけです。
urlpatterns += patterns('',
(r'^/url/to/ajax/view/$', 'myapp.views.my_ajax_view'),
)
ここが哲学的な違いの出番です。URL 自体を介してデータを渡すことを選択した場合は、それを urlpattern でキャプチャする必要があります。
(r'^/url/to/ajax/view/(?P<some_data>[\w-]+)/$, 'myapp.views.my_ajax_view'),
次に、それを引数として受け入れるようにビューを変更します。
def my_ajax_view(request, some_data):
最後に、Javascript AJAX メソッドを変更して URL に含めます。
$.getJSON('/url/to/ajax/view/'+some_data+'/', function(data, jqXHR){
リクエストでデータを渡すルートに進む場合は、ビューでデータを適切に取得するように注意する必要があります。
def my_ajax_view(request):
some_data = request.GET.get('some_data')
if some_data is None:
return HttpResponseBadRequest()
これで、Django でほぼすべての AJAX 機能を実行するのに十分なはずです。それ以外は、ビューがデータを取得する方法 (手動でデータを作成する、データベースにクエリを実行するなど) と、Javascript コールバック メソッドが JSON 応答を処理する方法に関するものです。それに関するいくつかのヒント:
アイテムが 1 つしか含まれていない場合でも、オブジェクトは通常リストになりdata
ます。アイテムが 1 つしかないことがわかっている場合は、そのまま使用できますdata[0]
。それ以外の場合は、for ループを使用して各項目にアクセスします。
form (var i=0; i<data.length; i++) {
// do something with data[i]
}
data
orがオブジェクトdata[i]
(AKA 辞書、ハッシュ、キー付き配列など) の場合、キーを属性として扱うことにより、キーの値にアクセスできます。つまり、次のようになります。
data[i].some_key
一般的に、JSON 応答と AJAX を処理する場合は、最初にブラウザーで直接試して、正確な応答を表示したり、応答の構造を確認したりできるようにすることをお勧めします。ブラウザーで JSON 応答を表示するには、拡張機能が必要になる可能性が高くなります。JSONView ( FirefoxとChromeの両方で利用可能) を使用すると、JSON を理解し、Web ページのように表示できます。リクエストが GET の場合、クエリ文字列を使用して通常の GET の方法で URL にデータを渡すことができますhttp://mydomain.com/url/to/ajax/view/?some_data=foo
。POST の場合は、ある種の REST テスト クライアントが必要になります。RESTClientは Firefox の優れたアドオンです。Chrome の場合、Postmanを試すことができます。これらは、Twitter、Facebook などからサードパーティ API を学習するのにも最適です。