2009-11-25 63 views
22

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

是否有某种方法可以模仿{% url %} templatetag在JavaScript中的行为?

例如,打印urlpatterns以^ajax开头,后来在脚本中用它们的实际值替换模式?

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

更新1: 我说的是计算的网址,而不是静态的:

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

回答

10

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

dutils是一个小工具库,旨在提供的JavaScript/Django开发的几个实用工具,这将有助于开发RIA在Django的后端之上。

它目前支持以下功能:

  • 产生的Django的URL反向方法...
+0

也检查出一些叉子。 Dimitri-Gnidash使用管理命令构建URL。 ljosa创建了一个视图,在飞行中建立它们。 – SystemParadox 2012-02-08 15:33:55

+0

看来这个解决方案仍然需要硬编码{url_name:pattern}字典。自动生成在dutils.conf.urls.example.js中找到的列表会很好。 – Fydo 2013-09-05 13:57:31

+0

@Fydo使用它https://github.com/ierror/django-js-reverse – 2017-05-12 15:19:49

4

我通常做的就是把网址在任何一个<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() { /* ... */ }); 
}); 

非标准属性是由所有主要的浏览器和隐藏要素很好的支持并不一定要在形式。

+0

你将与计算的URL做什么? url(r'^ ajax/delete /(?P image | audio)/(?P \ d +)/ from/set /(?P \ d +)/ $','blog.ajax.remove_item_from_set') , – dir01 2009-11-25 10:14:25

+0

你把它们放在页面上的某个地方(在Django模板中) - javascript是一个单独的文件,不是由django生成的。 – 2009-11-25 13:21:59

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的模板。担心表现?然后缓存结果。

+0

这是我的任务的缩写,所以面对它)JS文件将通过CDN传递。我可以做的是把urlpatterns放在我的页面顶部(设置js变量),并用真正的数据从正则表达式编译真实的URL – dir01 2009-11-25 10:20:33

+3

这种方法的缺点是没有办法使用视图参数。 – intgr 2012-05-09 09:31:13

+0

通过设计,混合语言是一个坏主意。 – azmeuk 2016-06-21 11:02:29

16

尝试生成URL字符串创建JavaScript的辅助函数(Django的模板)。在简单的形式,他们可能看起来像这样:

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

也许这有一些其他的影响,但我认为它应该工作。

+0

你救我一命,谢谢!只是一个观察,我想最好在占位符中使用id = 0,因为你永远不会有一个等于0,我们不能说112233相同,但在另一个可以有所有0的字符串改变,也许我们应该有一个模板来改变正确的位置。 – 2013-10-03 22:10:38

+0

我很高兴你喜欢我的解决方案。关于id,更重要的是你要替换的值不在url字符串中的其他地方。所以它不会真的计量它是0或112233,只要相同的值不在URL字符串中的其他地方。 – kodmasin 2013-12-07 21:45:18

2

首先,您应该为您的网址:

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

然后,你可以通过网址作为变量的模块:

<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+)。

我对这个解决方案有点不满意,最后我写了自己的应用程序来处理javascript与Django: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(); 
}); 
6

我们创建了一个小的应用程序用于此目的称为django-js-reverse

例如,您可以检索名为url

urls.py:??

URL(R'^/betterliving /(P [ - \ W] +)/(P \ d + )/ $”, 'get_house',名称= 'betterliving_get_house'),

以JavaScript等

网址。betterliving_get_house( '家',12)

结果:

/betterliving /房子/ 12/

1

可以从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) { 
     ... 
    }); 
    }); 
0

我发现这个很酷的django应用程序叫Django JS反向

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/