2012-08-01 10 views
8

私は基本的にユーザーがIDを選択するWebページを設定しようとしています。そのWebページはID情報をPythonに送ります。ここでPythonはIDを使ってデータベースを照会し、結果をWebページに返して表示します。javacriptの情報をdjangoアプリに返す

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

ありがとう、

+0

これはちょうど標準のDjangoのURL /ビューコードです。このコンテキストでは、Ajaxリクエストは通常​​のリクエストと同じです。 –

+1

AJAXとDjangoについての基本的な質問であるにもかかわらず(そしてその理由から)、私はこの質問が非常に有用であることを発見しました。このような「開始方法」の質問は、StackOverflowで(基本的な読み書きのチュートリアルでも)見つけるのが難しく、初心者にはかなりの労力をかけません。ありがとうxhassassin! – viridis

答えて

27

あなたはAJAXの話をしている中で、より効率的に処理することができますJSONのような別の形式にデータを変換します。 AJAXには常に3つのアイテムが必要です(技術的には2つしかありません:Javascriptは2重に機能します)。

  1. クライアント(この場合はJavascriptが)要求になります
  2. サーバー(この場合はDjangoのビュー)は、要求を処理し、戻りは(、再びJavascriptを)
  3. クライアントの応答レスポンスを受信し、それ
で何かをします

あなたは優先フレームワークを指定していませんが、何らかのJavascriptフレームワークなしでAJAXを実行するのは難しいでしょうから、jQueryを選択します。コードは、任意のJavaScriptフレームワークにかなり容易に適合することができます:私は、URLにGETリクエストを送信し、自動的にそれを回す、JSONとしてレスポンスを解析し、jQueryの便利なメソッドです$.getJSONを、使用してい

$.getJSON('/url/to/ajax/view/', {foo: 'bar'}, function(data, jqXHR){ 
    // do something with response 
}); 

ここでdataとして渡されるJavascriptオブジェクトです。最初のパラメータは、リクエストが送られるURLです(これ以上の情報は必要ありません)。2番目のパラメータは、リクエストと共に送信されるデータを含むJavascriptオブジェクトです(必要がない場合は省略できます)。任意のデータを送信します)、3番目のパラメータは、成功した場合にサーバーからの応答を処理するコールバック関数です。したがって、この単純なコードは、上記のパート1とパート3をカバーしています。

次の部分はハンドラです。この場合はもちろんDjangoのビューになります。このビューが必要request以外の任意の引数を取らないことを

from django.utils import simplejson 

def my_ajax_view(request): 
    # do something 
    return HttpResponse(simplejson.dumps(some_data), mimetype='application/json') 

注:ビューのための唯一の要件は、JSONレスポンスを返さなければならないということです。これは哲学的選択のビットです。 IMHOでは、実際のRESTのやり方では、データはリクエストではなくURLで渡されるべきですが、他の人はそれに同意できないし、そうでないこともあります。究極の選択はあなた次第です。

また、ここでは一般的なPythonデータ構造(リスト、辞書など)に最適なDjangoのsimplejsonライブラリを使用しました。 Djangoモデルのインスタンスまたはクエリーセットを返す場合は、代わりにシリアライザライブラリを使用する必要があります。 Djangoがどのようにルートリクエストをに知っているので、

from django.core import serializers 
... 
data = serializers.serialize('json', some_instance_or_queryset) 
return HttpResponse(data, mimetype='application/json') 

は今、あなたはビューを持っていることを、あなたがする必要があるのは、Djangoのurlpatternsにワイヤーそれまでです。

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): 

そして最後に、URLに含めるのJavascript AJAX方法を変更します。

$.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] 
    } 
    
  2. data又はdata[i]オブジェクト(AKA辞書、ハッシュ、キー付きアレイ、等)である場合は、処理することにより、キーの値にアクセスすることができ属性としてのキー、すなわち:あなたは、正確な応答を表示および/またはの構造を確認することができるように

    data[i].some_key 
    
  3. 一般的にはJSONレスポンスとAJAXを扱う、それは最初のブラウザで直接それをしようとするのが最善ですレスポンス。ブラウザでJSONレスポンスを表示するには、恐らく誇張が必要です。 JSONView(FirefoxChromeの両方で使用可能)を使用すると、JSONを理解してウェブページのように表示できます。リクエストがGETの場合、クエリ文字列(通常はhttp://mydomain.com/url/to/ajax/view/?some_data=foo)を使用して、通常のGET形式でURLにデータを渡すことができます。 POSTの場合は、RESTテストクライアントが必要です。 RESTClientはFirefox用の優れたアドオンです。 Chromeの場合はPostmanを試すことができます。これらは、Twitter、FacebookなどからのサードパーティAPIの学習にも最適です。

+1

非常に詳細な回答Chris。よくやった! – Jens

+2

良い答え!しかし、django.utils.simplejsonは[Django 1.5リリースノート](https://docs.djangoproject.com/en/1.5/releases/1.5-alpha-1/#system-info/)で述べられているように、Django 1.5以降で廃止予定です。 version-of-simplejson-no-longer-used) – viridis

+0

https://docs.djangoproject.com/en/1.10/releases/1.5/#system-version-of-simplejson-no-longer-used – joshlsullivan

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番目のレコードと同じです。

+0

ハハ、ありがとう。ええ、?P事は私が必要としていたものです、私はここで尋ねた後、数分のようにジャンゴチュートリアルで見つけました。 – xhassassin

0

ajaxリクエスト/ urlsから情報をキャプチャする方法については、普通のdjangoリクエストと同様に、通常url dispatcher docsをチェックし、公式ドキュメントからdjangoビューについて読むことができます。

レスポンスを返す方法については、パラメータを取得してリクエストを処理し、適切なミリティペープでレスポンスを返してください。

は時々、serializeに持っているか、クライアント側の/ jsの

関連する問題