Подтвердить что ты не робот

Django reverse() для JavaScript

В моем проекте у меня много методов Ajax, с внешними клиентскими сценариями (я не хочу включать JavaScript в шаблоны!), а изменение URL-адресов для меня - это боль, потому что мне нужно вручную изменить URL-адреса в моих вызовах Ajax.

Есть ли способ подражать поведению {% url %} templatetag в JavaScript?

Например, напечатать urlpatterns, начинающиеся с ^ajax, а затем в скриптах заменить шаблоны на их фактические значения?

Что, на мой взгляд, и мой вопрос - существуют ли какие-то общие практики для подобных действий? Может быть, некоторые многоразовые приложения? Также я буду рад прочитать любые советы и соответствующие мысли, которые у вас есть.

Обновление 1: Я говорю о вычисленных URL, а не о статических:

url(r'^ajax/delete/(?P<type>image|audio)/(?P<item_id>\d+)/from/set/(?P<set_id>\d+)/$', 'blog.ajax.remove_item_from_set'),
4b9b3361

Ответ 1

https://github.com/mlouro/django-js-utils

dutils - небольшая утилитная библиотека, целью которой является предоставление разработчикам JavaScript/Django нескольких утилит, которые помогут разработке RIA поверх Django Backend.

В настоящее время он поддерживает следующие функции:

  • Обратный метод для генерации URL-адресов Django...

Ответ 2

Попробуйте создать вспомогательные функции javascript (в шаблоне django) для генерации строки url. В простой форме они могут выглядеть так:

function generete_some_url(id){
    return "{% url some_url itemid=112233 %}".replace("112233", id);
}

Возможно, это имеет некоторые другие последствия, но я думаю, что он должен работать.

Ответ 3

Что случилось с помещением JavaScript в ваши шаблоны?

Вы часто хотите вызвать функцию инициализации в шаблоне HTML в любом случае, так почему бы не передать ей объект, содержащий URL-адреса, которые вы будете использовать?

<script>
MYGLOBAL.mymodule.init({
    fancy_ajax_url: '{% url fancy %}',
    fancier_ajax_url: '{% url fancier %}'
});
</script>

Если вы обнаружите, что передаете много переменных таким образом или хотите использовать логику в своем JavaScript, что вы делаете в своих HTML-шаблонах, то почему бы не отобразить ваш script через механизм шаблонов Django? Помните, что шаблоны Django предназначены не только для документов HTML - часто это помогает использовать шаблоны для обычного текста, XML, JSON, да и JavaScript, Обеспокоены выступлением? Затем кешируйте результат.

Ответ 4

Я создал механизм, который создает список шаблонов url в вашем проекте Django и выводит его в файл Javascript. Это вилка django-js-utils.

Ссылка репо находится здесь: https://github.com/Dimitri-Gnidash/django-js-utils

Ответ 5

Для этой цели мы создали небольшое приложение под названием django-js-reverse.

Например, вы можете получить именованный URL

urls.py:

url (r '^/betterliving/(? P [-\w] +)/(? P\d +)/$', 'get_house', name= 'betterliving_get_house'),

в javascript, например:

Urls.betterliving_get_house ('house', 12)

результат:

/betterliving/дом/12/

Ответ 6

Обычно я использую URL-адрес в элементе <input type="hidden" /> или в атрибуте rel="".

Затем, при написании JS (используя jQuery ниже), я:

$('div#show_more').click(function () {
    var url = $(this).attr('rel');
    // or
    var url = $('#more_url').val();

    $.get(url, function () { /* ... */ });
});

Нестандартные атрибуты хорошо поддерживаются всеми основными браузерами, а скрытые элементы не должны быть в формах.

Ответ 7

Во-первых, вы должны назвать свой URL:

url(r'^blog/(?P<item_id>\d+)/$', 'blog.ajax.remove_item', name='blog-item'),

Затем вы можете передавать URL-адреса в качестве переменных в свой модуль:

<script src="{{ STATIC_URL }}js/my-module.js"></script>
<script>
$(function(){
    MyModule.init('{% url blog-item item.id %}');
});
</script>
// js/my-module.js
var MyModule = {
    init: function(url) {
        console.log(url);
    }
};

Вы можете использовать токены в своем URL-адресе:

<script src="{{ STATIC_URL }}js/my-module.js"></script>
<script>
$(function(){
    MyModule.init("{% url blog-item item_id='0000' %}");
});
</script>
// js/my-module.js
var MyModule = {
    init: function(url) {
        var id = 1;
        this._url = url;
        console.log(this.url(id));
    },
    url: function(id) {
        return this._url.replace('0000', id);
    }
};

Обратите внимание, что ваш токен должен соответствовать типу regex для успешного решения (я не могу использовать {item_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;
        console.log(Django.url('blog-item', id));
    }
};

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

Ответ 8

Вы можете удалить параметры из URL-адреса и передать динамические части в качестве параметров запроса:

  $('#add-choice-button').on('click', function () {
    var thing_id = $(this).closest('.thing').attr('data-item-id');
    $.get('{% url 'addThing' %}?t='+thing_id, function (data) {
      ...
    });
  });

Ответ 9

Я нашел это классное приложение django под названием Django JS reverse

https://github.com/ierror/django-js-reverse

Если у вас есть URL-адрес, например

url(r'^/betterliving/(?P<category_slug>[-\w]+)/(?P<entry_pk>\d+)/$', 'get_house', name='betterliving_get_house'),

Затем вы делаете

Urls.betterliving_get_house('house', 12)

Результат

/betterliving/house/12/