Django URL переписывает и передает параметр из Javascript - PullRequest
3 голосов
/ 24 августа 2011

В качестве небольшого дополнительного вопроса к моему предыдущему, мне нужно передать параметр в представление.Этот параметр неизвестен, пока не выполнится 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 +).

Мне кажется, что если я изменю URL-адрес conf, который нарушает неспособность найти представление, и если я сделаю то, что я делаю выше, он выдаст мне ошибку NoREverseMatch.

Буду признателен за любые рекомендации.

Ответы [ 5 ]

5 голосов
/ 24 августа 2011

Я обычно делаю что-то вроде

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 голосов
/ 24 августа 2011

вы можете использовать этот проект, который предназначен для ответа на этот точный вопрос ...

уведомление: это может помочь хакеру нанести на карту веб-сайт: https://github.com/Dimitri-Gnidash/django-js-utils

Когда я не использую этот проект, я помещаю значение по умолчанию в URL-адрес и заменяю его на правильное значение.

, поэтому используйте полную обратную последовательность:

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

и даже если вы заменитес понедельника по понедельник это будет работать ...

примечание: этот уродливый хак не сможет работать, если ваше значение по умолчанию уже в URL, поэтому используйте его последовательно.

0 голосов
/ 02 ноября 2012

Вы можете использовать токены в своем 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();
});
0 голосов
/ 23 сентября 2012

У меня был похожий вопрос.Я хотел открыть 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,
  ...
});
0 голосов
/ 24 августа 2011

Почему бы просто не передать их как часть данных запроса. Вы можете использовать функцию get jQuery и передавать их как параметры.

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

Тогда, по вашему мнению, вы можете сделать:

meter = request.GET['meter_id']

Это позволит вам использовать его в вашем представлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...