23

私のプロジェクトには、外部のクライアント側スクリプトを使用したAjaxメソッドがたくさんあり(JavaScriptをテンプレートに含めたくない!)、Ajax呼び出しのURLを手動で変更する必要があるため、URLを変更するのはちょっと面倒です。 。

{% url %}JavaScriptでtemplatetagの動作をエミュレートする方法はありますか?

たとえば^ajax、スクリプトで始まり以降のurlpatternsを印刷すると、パターンが実際の値に置き換えられますか?

それが私の頭の中にあり、私の質問は-そのようなことをするための一般的な慣行はありますか?多分いくつかの再利用可能なアプリケーション?また、私はあなたが持っているアドバイスや関連する考えを読んでうれしいです。

更新1: 静的URLではなく計算URLについて話している:

url(r'^ajax/delete/(?P<type>image|audio)/(?P<item_id>\d+)/from/set/(?P<set_id>\d+)/$', 'blog.ajax.remove_item_from_set'),
4

9 に答える 9

19

URL文字列を生成するためのjavascriptヘルパー関数(djangoテンプレート内)を作成してみてください。単純な形式では、次のようになります。

function generete_some_url(id){
    return "{% url some_url itemid=112233 %}".replace("112233", id);
}

多分これは他のいくつかの意味を持っていますが、私はそれがうまくいくはずだと思います。

于 2011-10-16T21:07:34.747 に答える
14

テンプレートにJavaScriptを入れることの何が問題になっていますか?

とにかくHTMLテンプレートで初期化関数を呼び出したいことがよくあるので、使用するURLを含むオブジェクトをHTMLテンプレートに渡してみませんか?

<script>
MYGLOBAL.mymodule.init({
    fancy_ajax_url: '{% url fancy %}',
    fancier_ajax_url: '{% url fancier %}'
});
</script>

この方法で多くの変数を渡す場合、またはHTMLテンプレートで行うJavaScriptのロジックを使用したい場合は、Djangoのテンプレートエンジンを使用してスクリプトをレンダリングしてみませんか?DjangoテンプレートはHTMLドキュメント専用ではないことを忘れないでください。多くの場合、プレーンテキスト、XML、JSON、さらにはJavaScript用のテンプレートを使用すると便利です。パフォーマンスが心配ですか?次に、結果をキャッシュします。

于 2009-11-25T10:09:58.953 に答える
12

DjangoプロジェクトでURLパターンのリストを作成し、それをJavascriptファイルに出力するメカニズムを作成しました。django-js-utilsのフォークです。

リポジトリのリンクはここにあります: https ://github.com/Dimitri-Gnidash/django-js-utils

于 2011-05-03T21:46:09.273 に答える
10

https://github.com/mlouro/django-js-utils

dutilsは、JavaScript / Django開発者に、Djangoバックエンド上でのRIAの開発に役立ついくつかのユーティリティを提供することを目的とした小さなユーティリティライブラリです。

現在、次の機能をサポートしています。

  • DjangoURLを生成するための逆の方法...
于 2011-03-21T14:57:45.223 に答える
7

この目的のために、django-js-reverseという小さなアプリを作成しました。

たとえば、名前付きURLを取得できます

urls.py:

url(r'^ / betterliving /(?P [-\ w] +)/(?P \ d +)/ $'、'get_house'、name ='betterliving_get_house')、

次のようなJavaScriptで:

Urls.betterliving_get_house('house'、12)

結果:

/ betterliving / house / 12 /

于 2013-02-05T16:29:13.303 に答える
4

私が通常行うことは、URLを<input type="hidden" />要素またはrel=""属性のいずれかに配置することです。

次に、JSを作成するとき(以下のjQueryを使用)、次のようにします。

$('div#show_more').click(function () {
    var url = $(this).attr('rel');
    // or
    var url = $('#more_url').val();

    $.get(url, function () { /* ... */ });
});

非標準の属性はすべての主要なブラウザで十分にサポートされており、非表示の要素をフォームに含める必要はありません。

于 2009-11-25T09:35:16.990 に答える
2

まず、URLに名前を付ける必要があります。

url(r'^blog/(?P<item_id>\d+)/$', 'blog.ajax.remove_item', name='blog-item'),

次に、URLを変数としてモジュールに渡すことができます。

<script src="{{ STATIC_URL }}js/my-module.js"></script>
<script>
$(function(){
    MyModule.init('{% url blog-item item.id %}');
});
</script>
// js/my-module.js
var MyModule = {
    init: function(url) {
        console.log(url);
    }
};

URLでトークンを使用できます。

<script src="{{ STATIC_URL }}js/my-module.js"></script>
<script>
$(function(){
    MyModule.init("{% url blog-item item_id='0000' %}");
});
</script>
// js/my-module.js
var MyModule = {
    init: function(url) {
        var id = 1;
        this._url = url;
        console.log(this.url(id));
    },
    url: function(id) {
        return this._url.replace('0000', id);
    }
};

正常に解決するには、トークンが正規表現タイプと一致する必要があることに注意してください({item_id}で定義されているため、トークンとして使用できません\d+)。

私はこのソリューションに少し不満を持っていたので、最後にdjangoでjavascriptを処理する独自のアプリケーションを作成しました:django.js。このアプリケーションを使用すると、次のことができます。

{% load js %}
{% django_js %}
{% js "js/my-module.js" %}
// js/my-module.js
var MyModule = {
    init: function() {
        var id = 1;
        console.log(Django.url('blog-item', id));
    }
};

$(function(){
    MyModule.init();
});
于 2012-11-02T17:26:33.020 に答える
2

URLからパラメーターを削除し、動的部分をクエリパラメーターとして渡すことができます。

  $('#add-choice-button').on('click', function () {
    var thing_id = $(this).closest('.thing').attr('data-item-id');
    $.get('{% url 'addThing' %}?t='+thing_id, function (data) {
      ...
    });
  });
于 2014-05-25T06:26:35.643 に答える
1

DjangoJSリバースと呼ばれるこのクールなdjangoアプリを見つけました

https://github.com/ierror/django-js-reverse

あなたがのようなURLを持っているなら

url(r'^/betterliving/(?P<category_slug>[-\w]+)/(?P<entry_pk>\d+)/$', 'get_house', name='betterliving_get_house'),

その後、あなたはします

Urls.betterliving_get_house('house', 12)

結果は

/betterliving/house/12/
于 2018-01-14T06:34:55.593 に答える