Django url rewrites and passing a parameter from Javascript - Stack Overflow

As a bit of a followup question to my previous , I need to pass a parameter to a view. This parameter i

As a bit of a followup question to my previous , I need to pass a parameter to a view. This parameter is not known until the JS executes.

In my 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"),

I can pass it this URL and it works great! ( thanks to you guys).

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

In My template I have this:

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

In my javascript:

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

When this triggers it works fine except I dont necessarily want Monday all the time.

If I change the javascript to this:

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,
        plete: pleteCallback
    });

I get the Caught NoReverseMatch while rendering error. I assume because the URLconf still wants to rewrite to include the ?P\w+) .

I seems like if I change the URL conf that breaks the abailty to find the view , and if I do what I do above it gives me the NoREverseMatch error.

Any guidance would be appreciated.

As a bit of a followup question to my previous , I need to pass a parameter to a view. This parameter is not known until the JS executes.

In my 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"),

I can pass it this URL and it works great! ( thanks to you guys).

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

In My template I have this:

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

In my javascript:

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

When this triggers it works fine except I dont necessarily want Monday all the time.

If I change the javascript to this:

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,
        plete: pleteCallback
    });

I get the Caught NoReverseMatch while rendering error. I assume because the URLconf still wants to rewrite to include the ?P\w+) .

I seems like if I change the URL conf that breaks the abailty to find the view , and if I do what I do above it gives me the NoREverseMatch error.

Any guidance would be appreciated.

Share Improve this question asked Aug 23, 2011 at 20:34 William T WildWilliam T Wild 1,0321 gold badge14 silver badges24 bronze badges
Add a ment  | 

5 Answers 5

Reset to default 5

I usually do something along the lines of

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

you may want to use this kind of project which is meant to answer to this precise question...

notice: it may help hacker to map the website: https://github./Dimitri-Gnidash/django-js-utils

When I don't use this project I put a default value in the url and replace it by correct value.

so use a plete reverse then:

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

and even if you replace monday by monday it will works...

note: this ugly haks will fail if your default value is already sooner in the url so use it consequently.

Why not just pass them in as part of the request data. You can use the jQuery get function and pass them in as paramaters.

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

Then in your view you can do:

meter = request.GET['meter_id']

This will allow you to use it in your view.

I had a similar question. I wanted to open a URL when someone clicked a button. For what it's worth, here is how I handled this situation.

Define the URL as an attribute:

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

Using jQuery, read the attribute and carry on:

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

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

You could use tokens in your url and pass it as a variable to your module:

<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,
            plete: pleteCallback
        });
    },
    one_day_url: function(meter_id, day) {
        return this._one_day_url.replace('0000', meter_id).replace('{day}', day);
    }
};

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

I'm 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, 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,
            plete: pleteCallback
        });
    }
};

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

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744728113a4590302.html

相关推荐

  • Django url rewrites and passing a parameter from Javascript - Stack Overflow

    As a bit of a followup question to my previous , I need to pass a parameter to a view. This parameter i

    13小时前
    10

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信