13

だから私は基本的に、ユーザーがIDを選択するWebページを設定しようとしています.WebページはID情報をPythonに送信し、PythonはIDを使用してデータベースを照会し、結果をWebページに返して表示します。

これを行う方法がよくわかりません。ajax 呼び出しを使用して Python によって生成されたデータを呼び出す方法は知っていますが、最初の ID 情報を django アプリに伝える方法がわかりません。./app/id (IE /app/8) のような URL を照会し、その URL 情報を使用して Python に情報を提供することは可能ですか? urls.py と views.py を編集するにはどうすればよいですか?

ありがとう、

4

3 に答える 3

30

あなたはAJAXについて話している。AJAX は常に 3 つの部分を必要とします (技術的には 2 つだけです。Javascript は 2 つの役割を果たします)。

  1. クライアント (この場合は Javascript) がリクエストを行います
  2. サーバー (この場合は Django ビュー) がリクエストを処理し、レスポンスを返します
  3. クライアント (ここでも 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. アイテムが 1 つしか含まれていない場合でも、オブジェクトは通常リストになりdataますアイテムが 1 つしかないことがわかっている場合は、そのまま使用できますdata[0]。それ以外の場合は、for ループを使用して各項目にアクセスします。

    form (var i=0; i<data.length; i++) {
        // do something with data[i]
    }
    
  2. dataorがオブジェクトdata[i](AKA 辞書、ハッシュ、キー付き配列など) の場合、キーを属性として扱うことにより、キーの値にアクセスできます。つまり、次のようになります。

    data[i].some_key
    
  3. 一般的に、JSON 応答と AJAX を処理する場合は、最初にブラウザーで直接試して、正確な応答を表示したり、応答の構造を確認したりできるようにすることをお勧めします。ブラウザーで JSON 応答を表示するには、拡張機能が必要になる可能性が高くなります。JSONView ( FirefoxChromeの両方で利用可能) を使用すると、JSON を理解し、Web ページのように表示できます。リクエストが GET の場合、クエリ文字列を使用して通常の GET の方法で URL にデータを渡すことができますhttp://mydomain.com/url/to/ajax/view/?some_data=foo。POST の場合は、ある種の REST テスト クライアントが必要になります。RESTClientは Firefox の優れたアドオンです。Chrome の場合、Postmanを試すことができます。これらは、Twitter、Facebook などからサードパーティ API を学習するのにも最適です。

于 2012-08-01T16:52:34.573 に答える
1

はい、可能です。アプリ内で使用するビューにパラメーターとして id を渡す場合、たとえば def example_view (request,id) urls.py では、次のようなものを使用できます: url(r'^example_view/(?P<id>\d+)/', 'App.views.example_view')

URL の ID は/example_view_template/8、数字 8 に関連する ID を使用して結果にアクセスします。たとえば、データベース内の特定のテーブルの 8 番目のレコードのように。

于 2012-08-01T15:51:39.007 に答える
0

ajax リクエスト/URL から情報を取得する方法については、通常、通常の Django リクエストと同じように行うことができます。URLディスパッチャ ドキュメントを確認し、公式ドキュメントから Django ビューについて読んでください。

応答を返す方法については、パラメーターを取得し、要求を処理してから、適切な mimitype で応答を返します。

場合によっては、クライアント側/jsでより効率的に処理できるjsonなどの別の形式にデータをシリアル化または変換する必要があります

于 2012-08-01T15:55:30.430 に答える