[Django]-Django url rewrites and passing a parameter from Javascript

2👍

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.com/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 complete 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.

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

0👍

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.

0👍

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,
  ...
});
👤Bagee

0👍

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,
            complete: completeCallback
        });
    },
    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,
            complete: completeCallback
        });
    }
};

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

Leave a comment