23

在我的项目中,我有很多Ajax方法,带有外部客户端脚本(我不想将 JavaScript 包含到模板中!),更改 URL 对我来说有点痛苦,因为我需要手动更改 Ajax 调用中的 URL .

有什么方法可以模拟{% url %}JavaScript 中模板标签的行为吗?

例如,打印 urlpatterns 开始^ajax和后面的脚本用它们的实际值替换模式?

这就是我的想法,我的问题是 - 有没有常见的做法来做这样的事情?也许一些可重用的应用程序?此外,我很乐意阅读您的任何建议和相关想法。

更新 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 的对象呢?

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

如果您发现自己以这种方式传递了很多变量,或者想在 JavaScript 中使用您在 HTML 模板中执行的逻辑,那么为什么不通过 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。

它目前支持以下功能:

  • 用于生成 Django url 的反向方法...
于 2011-03-21T14:57:45.223 回答
7

为此,我们创建了一个名为django-js-reverse的小应用程序。

例如,您可以检索一个命名的 url

网址.py:

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

在 javascript 中,如:

Urls.betterliving_get_house('房子', 12)

结果:

/更好的生活/房子/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

First, you should name your url:

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

Then you could pass urls as variables to your module:

<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);
    }
};

You could use tokens in your 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);
    }
};

Notice that your token should match the regex type to resolve successfully (I can't use {item_id} as token because it's defined with \d+).

I was a little bit unsatisfied with this solution and I ended by writing my own application to handle javascript with django: django.js. With this application, I can do:

{% 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

我发现了这个很酷的 django 应用,叫做 Django JS reverse

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

如果你有一个像

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 回答