2012-11-12 9 views
7

DjangoとAJAXの使用について議論している投稿とページがたくさんあります。この質問の回答を探しています。概要:例のAJAXコールでDjango URLタグを使用する

月には、このようなハードコーディングされたURLを表示:

$.post("/projects/create/", {"name" : name}, function(data) {... 

または一部は、タグが、パラメータなしでURLテンプレートを使用します。ただし

$.post("{% url create_project %}", {"name" : name}, function(data) {... 

を、 URLにDjangoスタイルのパラメータを含めたいと思います。私のURLの定義は次のとおりです。

url(r'ajax/entity_name/(?P<pk>\w+)/$',EntityAjaxView.as_view(),name='entity_name'), 

はい、私はクラスベースのビューを使用しています、それはDetailViewに基づいています。このビューは、URLで提供されるPK値にデフォルトで検索し、通常のテンプレートに私が使用します。

{% url entity_name id_number %} 

リンクを提供します。私のコードでは、pk値の入力ボックスに入力された値を取得したいと思います。ここでは(動作しない)私のJavaScriptのスニペットです:

var id_number = $('#id_endowmententity_set-' + rownum + '-id_number').val() 
$.ajax({ 
    type: "GET", 
url: '{% url entity_name id_number %}', 

だから、私の質問は、私は、入力ボックスから値をURLテンプレートタグを使うことができ、ありますか?

(私は私が代わりにGETのPOSTを使用して、POSTデータにID_NUMBERを渡すことができることを知っているが、それはDetailViewとうまく動作しません。)あなたの助けを事前に

感謝。

答えて

10

Djangoはサーバー側のアプリケーションです。 Javascriptはクライアント側です。 Djangoテンプレートはサーバー上でレンダリングされるので、サーバー側で{% url entity_name id_number %}が評価され、その値がクライアントに返されます。このため、Djangoのテンプレートとjavascriptを組み合わせることは不可能です。しかし、あなたの問題を解決するためにできることはいくつかあります。

あなたはajax呼び出しを行い、ajax呼び出しはユーザーの入力に依存するため、クライアントがサーバーに任意のタイプのユーザー入力を送信する最適なルートは、クエリー文字列を使用するか(? URL)またはPOSTデータを送信してください。だから最も簡単なのは、URLにpkを含めないようにあなたのURLを変更することですが、それはGETまたはPOSTデータの一部として取得するためです。

url(r'ajax/entity_name/$', EntityAjaxView.as_view(), name='entity_name'), 

とビュー(申し訳ありません、私はクラスベースのビューに精通していないよ):

def entity_name(request): 
    pk = request.GET.get('pk') 
    ... 

最もエレガントな解決策になると私には思えます。ただし、クライアント側でURLを構築する必要がある場合は、サーバー側でテンプレートURLを生成し、クライアント側で必要な部分を置き換えて完全なURLを取得することができます。しかし、これはより多くのメンテナンスを必要とするため、エラーが発生しやすくなります。このアプローチのシンプルな例:

var id_number = $('#id_endowmententity_set-' + rownum + '-id_number').val(), 
    url = '{% url entity_name 0 %}'.replace('0', id_number); 
$.ajax({ 
    type: "GET", 
    url: url, 
    ... 
}); 
+0

2つの良いオプションがあります。ありがとう! – Dashdrum

関連する問題