Как передать определенный порядок pk модалу начальной загрузки в Django? - PullRequest
0 голосов
/ 19 ноября 2018

Есть ли способ передать pk определенного, скажем, порядка pk в модель начальной загрузки?Я пытался использовать jquery, но шаблон тега {% url 'accept' pk=orderPK %} вызывает проблему.

Я пытался дать его напрямую или с тегом шаблона, но, кажется, не работает.

$(document).on("click", "#accept_button", function () {
    let orderID = $(this).data('id');
    {#url = "{"+"%"+" url 'accept' pk = " + orderID + " %"+"}";#}
    url = "{% url 'accept' pk =" + orderID +" %}"; #with template tag
    {#url = "accept/"+orderID#}         #directly
    $(".modal-body .form").attr('action', url );

Ошибка:

TemplateSyntaxError at /dashboard/warehouse/response/
Could not parse the remainder: '=" + orderID +"' from '=" + orderID +"'

РЕДАКТИРОВАТЬ:

После некоторых обновлений

url = "{% url 'accept' pk=orderID %}".replace(/orderID/, orderID.toString())
    $(".modal-body .form").attr('action',url);

ошибка изменилась:

NoReverseMatch at /dashboard/warehouse/response/
Reverse for 'accept' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried:
['dashboard/warehouse/response/accept/(?P<pk>[0-9]+)/$']

1 Ответ

0 голосов
/ 19 ноября 2018

Первая ошибка вызвана этой строкой:

url = "{% url 'accept' pk =" + orderID +" %}"

Это неверный синтаксис, поэтому Django выдает ошибку.


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

Итак, это не сработает:

let orderID = $(this).data('id');

url = "{% url 'accept' pk =" + orderID +" %}"

Здесь вы пытаетесь использовать JS для замены orderID идентификатором объекта. Поскольку шаблоны компилируются на сервере, ваш код JS не будет работать. Вместо этого Django попытается скомпилировать URL с тем, что вы дали.

И если вы думаете о повторном использовании тега {% url %} в своем коде JS, это тоже не сработает, потому что шаблон находится вне сервера. И django не может работать в браузере вашего клиента.


Решением будет не использовать теги шаблонов django в вашем коде JS:

let orderID = $(this).data('id');

url = '/accept/' + orderID + '/';

Теперь я знаю, что это плохая практика - так жестко кодировать ваши URL. Таким образом, другим решением будет установить атрибут data-url для каждого заказа.

<button data-id="{{ order.id }}" data-url="{{ order.get_absolute_url }}">

А затем прочитайте URL заказа из этого атрибута данных в вашем коде JS.

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