Django的URL重写并传递了一个参数从Javascript

问题描述:

作为我以前的一个后续问题,我需要传递一个参数到一个视图。该参数在JS执行之前是未知的。Django的URL重写并传递了一个参数从Javascript

在我的URLconf:

url(r'^person/device/program/oneday/(?P<meter_id>\d+)/(?P<day_of_the_week>\w+)/$', 
therm_control.Get_One_Day_Of_Current_Thermostat_Schedule.as_view(), 
name="one-day-url"), 

我可以通过它这个URL和它的伟大工程! (感谢你们)。

http://127.0.0.1:8000/personview/person/device/program/oneday/149778/Monday/ 

在我的模板,我有这样的:

var one_day_url = "{% url personview:one-day-url meter_id=meter_id day_of_the_week='Monday' %}"; 

在我的javascript:

$.ajax({ 
     type: 'GET', 
     url: one_day_url , 
     dataType: "json", 
     timeout: 30000, 
     beforeSend: beforeSendCallback, 
     success: successCallback, 
     error: errorCallback, 
     complete: completeCallback 
    }); 

触发此动作时能正常工作,除了我不希望一定周一所有的时间。

如果我改变javascript来此:

var one_day_url = "{% url personview:one-day-url meter_id=meter_id %}"; 

and then 

$.ajax({ 
     type: 'GET', 
     url: one_day_url + '/Monday/', 
     dataType: "json", 
     timeout: 30000, 
     beforeSend: beforeSendCallback, 
     success: successCallback, 
     error: errorCallback, 
     complete: completeCallback 
    }); 

我得到的夹缝NoReverseMatch同时渲染错误。我假设,因为URLconf仍然要重写以包含?P \ w +)。

我似乎是如果我改变URL的conf,打破abailty找到视图,如果我做了我上面做的事情,它给了我NoREverseMatch错误。

任何指导,将不胜感激。

您可能希望使用这种项目,该项目是为了回答这个确切的问题的...

通知:它可以帮助黑客对网站地图: https://github.com/Dimitri-Gnidash/django-js-utils

当我不t使用这个项目,我把一个默认值的URL并将其替换为正确的值。

所以使用则完全相反:

url: one_day_url.replace('/Monday/','/Caturday/') 

即使你在星期一更换周一它将作品...

注意:如果您的默认值已经越早丑陋haks将失败在网址中,因此使用它。

+0

我贴我记得更换问题后和它的工作。我希望有一个更加优雅的解决方案可以在框架的正常运行中发挥作用。非常感谢! –

+0

不客气。链接库可能是解决复杂问题的好方法,以避免重复自己并保持灵活性。 – christophe31

我通常做沿着

var one_day_url = "{% url personview:one-day-url meter_id=meter_id day_of_the_week='REPLACE_ME' %}"; 
// ... 
url: one_day_url.replace('REPLACE_ME', 'Sunday') 

线的东西为什么不只是通过他们的请求数据的一部分。您可以使用jQuery get函数并将它们作为参数传入。

$.get("{%url personview%}", {'meter_id':"meter_id", "day_of_the_week":"monday" ...}, function(){do stuff when info is returned}); 

然后在您的视图,你可以这样做:

meter = request.GET['meter_id'] 

这将允许您在您的视图中使用它。

我有一个类似的问题。我想在有人点击按钮时打开一个URL。对于它的价值,这里是我如何处理这种情况。

定义URL作为一个属性:

{% for article in articles %}  
    <button data-article-url="{% url view_article article.id %}"> 
    Read Article #{{ article.id }} 
    </button> 
{% endfor %} 

使用jQuery,读取属性并进行:

var article_url = $(this).attr("data-article-url"); 

$.ajax({ 
    url: article_url, 
    ... 
}); 

你可以在你的URL中使用的令牌,并把它作为一个变量您模块:

<script src="{{ STATIC_URL }}js/my-module.js"></script> 
<script> 
$(function(){ 
    MyModule.init(
     "{% url personview:one-day-url meter_id='0000' day_of_the_week='{day}' %}" 
    ); 
}); 
</script> 
// js/my-module.js 
var MyModule = { 
    init: function(one_day_url) { 
     var id = 1, day = 'Saturday'; 
     this._one_day_url = one_day_url; 
     console.log(this.one_day_url(id, day)); 

     $.ajax({ 
      type: 'GET', 
      url: this.one_day_url(id, day), 
      dataType: "json", 
      timeout: 30000, 
      beforeSend: beforeSendCallback, 
      success: successCallback, 
      error: errorCallback, 
      complete: completeCallback 
     }); 
    }, 
    one_day_url: function(meter_id, day) { 
     return this._one_day_url.replace('0000', meter_id).replace('{day}', day); 
    } 
}; 

ñ该标记应该与正则表达式类型匹配才能成功解析(我不能使用{meter_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, day = 'Saturday'; 

     console.log(
      Django.url('personview:one-day-url', id, day), 
      Django.url('personview:one-day-url', [id, day]), 
      Django.url('personview:one-day-url', { 
       meter_id: id, 
       day_of_week: day 
      }) 
     ); 

     $.ajax({ 
      type: 'GET', 
      url: Django.url('personview:one-day-url', id, day), 
      dataType: "json", 
      timeout: 30000, 
      beforeSend: beforeSendCallback, 
      success: successCallback, 
      error: errorCallback, 
      complete: completeCallback 
     }); 
    } 
}; 

$(function(){ 
    MyModule.init(); 
});