【问题标题】:Django url rewrites and passing a parameter from JavascriptDjango url 重写并从 Javascript 传递参数
【发布时间】:2011-08-23 20:34:51
【问题描述】:

作为我之前的一个后续问题,我需要将参数传递给视图。这个参数在 JS 执行之前是未知的。

在我的 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
    });

我在渲染错误时收到 Caught NoReverseMatch。我假设是因为 URLconf 仍然想重写以包含 ?P\w+) 。

似乎如果我更改了破坏 abailty 以查找视图的 URL conf,并且如果我按照上面的操作进行操作,则会出现 NoREverseMatch 错误。

任何指导将不胜感激。

【问题讨论】:

    标签: javascript django


    【解决方案1】:

    我通常会做一些类似的事情

    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')
    

    【讨论】:

      【解决方案2】:

      你可能想使用这种旨在回答这个精确问题的项目......

      注意:它可能有助于黑客映射网站: https://github.com/Dimitri-Gnidash/django-js-utils

      当我不使用这个项目时,我会在 url 中放置一个默认值并用正确的值替换它。

      所以使用完全相反的方式:

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

      即使您将星期一替换为星期一,它也会起作用...

      注意:如果您的默认值在 url 中已经较早,那么这个丑陋的 haks 将失败,因此请使用它。

      【讨论】:

      • 在我发布了我记得替换的问题后,它确实有效。我希望有一个更优雅的解决方案可以在框架的正常运行中工作。非常感谢!
      • 不客气。链接库可能是解决复杂问题的好答案,避免重复自己并保持灵活性。
      【解决方案3】:

      为什么不将它们作为请求数据的一部分传入。您可以使用 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']
      

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

      【讨论】:

        【解决方案4】:

        我也有类似的问题。当有人单击按钮时,我想打开一个 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,
          ...
        });
        

        【讨论】:

          【解决方案5】:

          您可以在您的 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+ 定义的)。

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

          【讨论】:

            猜你喜欢
            • 2012-05-13
            • 1970-01-01
            • 1970-01-01
            • 2014-03-22
            • 2021-01-05
            • 1970-01-01
            • 2021-05-27
            • 1970-01-01
            • 2013-10-13
            相关资源
            最近更新 更多