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'),
Ответы
Ответ 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/