Передача из 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 %}
Вернуться на верх