Передача из Javascript в Django URL шаблона с PK
Я успешно реализовал Ajax Search и результаты загружаются в таблицу, которая находится в файле шаблона. Мои TH статичны и я добавляю каждый результат в < tr > < td >... в цикле foreach.
tableBody.innerHTML += `
<tr>
<td>${item.sku}</th>
<td>${item.etat}</td>
<td ${item.nom}</td>
<td>${item.sst1}</td>
<td>${item.sst2}</td>
<td>${item.sst3}</td>
<td>${item.pua}</td>
<td>${item.cau}</td>
<td><a href="/facture/auto-product-details/${item.id}">
<button type="button" class="btn btn-sm btn-labeled btn-
info">
<span style="color: #fff;" class="btn-label"><i class="fas
fa-sign-in-alt"></i></span></a></td>
</tr>
`;
Моя проблема в том, что мне пришлось (выше) "жестко закодировать" мой URL "auto-product-details", потому что когда я пытаюсь соблюсти синтаксис шаблона Django вот так :
<td><a href="{% url 'auto-product-details' ${item.id} %}">...
но URL преобразуется в
/facture/%7B%%20url%20'auto-product-details'%2036%20%%7D
Я пытался построить по частям свой URL в JS, пытался заменить {item.id } после создания базового (var) url без PK ... без успеха. Похоже, что специальные символы преобразуются в HTML.
Есть ли способ достичь того, что я хочу сделать?
Вы можете использовать промежуточную переменную:
my_url = "{% url 'auto-product-details' ${item.id} %}"
tableBody.innerHTML += '
<tr>
<td>${item.sku}</th>
<td>${item.etat}</td>
<td ${item.nom}</td>
<td>${item.sst1}</td>
<td>${item.sst2}</td>
<td>${item.sst3}</td>
<td>${item.pua}</td>
<td>${item.cau}</td>
<td><a href="'+my_url+'">
<button type="button" class="btn btn-sm btn-labeled btn-
info">
<span style="color: #fff;" class="btn-label"><i class="fas
fa-sign-in-alt"></i></span></a></td>
</tr>
';
Это никогда не будет работать так, как вы думаете, потому что то, что делает Django, это берет теги, такие как {{ item.id }} или {% url 'auto-product-details' item.id %} и заменяет их значениями, когда вы render шаблон. Ваш JavaScript загрузится ПОСЛЕ того, как это произойдет. На самом деле, /facture/%7B%%20url%20'auto-product-details'%2036%20%%7D - это просто url-кодированная строка (т.е. %7D - это просто символ, }.
Я не уверен, чего вы пытаетесь достичь, но вы можете просто сделать все это в своем шаблоне без какого-либо JavaScript, предполагая, что вы передаете элементы со всеми элементами, которые вы будете перебирать в своей функции рендеринга. Затем в вашем шаблоне, что-то вроде этого.
{% for item in items %}
<tr>
<td>{{ item.sku }}</th>
...
<td><a href="{% url 'auto-product-details' item.id %}">
<button type="button" class="btn btn-sm btn-labeled btn-
info">
<span style="color: #fff;" class="btn-label"><i class="fas
fa-sign-in-alt"></i></span></a></td>
</tr>
{% endfor %}