2012-07-09 58 views
1

我想要像在代码中注入一个变量到url中。但它给出了一个错误。Django和javascript问题

function initializeDataTable(id){ 
     var columnSize = $('table th').size(); 
    $('#table').dataTable({ 
     "sDom" : 'rtFip>', 
     'fnDrawCallback' : function() { 
      $('input:checkbox, input:radio').checkbox(); 
     }, 
     "bStateSave": true, 
     'sPaginationType' : 'full_numbers', 
     "bServerSide" : true, 
     "sAjaxSource" : "{% url 'get_menu_list' '" + id + "' %}" 
    }); 
    }; 

我想要选择的选项和选项更改事件中,我将调用上面的函数。我怎样才能做到这一点?

+0

什么错误。特别是? – Austin 2012-07-09 20:09:56

回答

2

你不能做到这一点:

"sAjaxSource" : "{% url 'get_menu_list' '" + id + "' %}" 

{% %}是服务器端的指令。服务器处理它们,然后将它们放入响应页面。 JavaScript函数运行客户端。它无法与服务器通话,并以您期望的方式询问数据。你将不得不做一些不依赖于服务器的东西,比如:

"sAjaxSource": "/get_menu_list/" + id 
0

我想你把服务器端的东西和客户端混淆了。这件作品

"{% url 'get_menu_list' '" + id + "' %}" 

应该在服务器端解释。那时服务器端不知道'id'是什么。

+0

不,它不起作用。Claudiu先生的解决方案有效。我认为我们不能使用这样的url反向函数。 – Burak 2012-07-09 20:34:24

+0

@Burak我不是说它在工作。我解释了为什么这段代码错了 – icn 2012-07-09 20:43:04

+0

好吧,我明白你的意思了。谢谢。 – Burak 2012-07-09 22:38:39

0

然后,你可以通过URL作为变量的函数:

<script> 
function initializeDataTable(data_url) { 
    var columnSize = $('table th').size(); 

    $('#table').dataTable({ 
     "sDom" : 'rtFip>', 
     'fnDrawCallback' : function() { 
      $('input:checkbox, input:radio').checkbox(); 
     }, 
     "bStateSave": true, 
     'sPaginationType' : 'full_numbers', 
     "bServerSide" : true, 
     "sAjaxSource" : data_url 
    }); 
} 

$(function(){ 
    initializeDataTable("{% url 'get_menu_list' item.id %}"); 
}); 
</script> 

你可以在你的URL中使用的令牌:

<script> 
var url_pattern = "{% url 'get_menu_list' '{id}' %}"; 
function initializeDataTable(id) { 
    var columnSize = $('table th').size(); 

    $('#table').dataTable({ 
     "sDom" : 'rtFip>', 
     'fnDrawCallback' : function() { 
      $('input:checkbox, input:radio').checkbox(); 
     }, 
     "bStateSave": true, 
     'sPaginationType' : 'full_numbers', 
     "bServerSide" : true, 
     "sAjaxSource" : url_pattern.replace('{id}', id) 
    }); 
} 

$(function(){ 
    initializeDataTable(42); 
}); 
</script> 

请注意,您的令牌应该匹配的正则表达式类型成功地解析(如果使用定义,则使用{id}作为标记,而不使用0000)。

我对这个解决方案有点不满意,最后我写了自己的应用程序来处理javascript与Django:django.js

有了这个应用程序,你可以这样做:

{% load js %} 
{% django_js %} 
<script> 
function initializeDataTable(id) { 
    var columnSize = $('table th').size(); 

    $('#table').dataTable({ 
     "sDom" : 'rtFip>', 
     'fnDrawCallback' : function() { 
      $('input:checkbox, input:radio').checkbox(); 
     }, 
     "bStateSave": true, 
     'sPaginationType' : 'full_numbers', 
     "bServerSide" : true, 
     "sAjaxSource" : Django.url('get_menu_list', id) 
    }); 
} 

$(function(){ 
    initializeDataTable(42); 
}); 
</script> 

为了确保URL由Django.js加载,听ready事件:

// Wait for document ready 
$(function(){ 
    initializeDataTable(42); 
}); 

// Wait for Django ready 
Django.onReady(function(){ 
    initializeDataTable(42); 
});