Render_to_string не может корректно обратиться к контексту

Я хочу использовать weasyprint для преобразования html-шаблона в PDF. Я использую Django 5.0.

Вот часть моего шаблона ( Шаблон работает нормально, Django отображает его правильно):

<div>
    <h1>Tu Pedido está listo, {{request.user.username}}!</h1>
</div>

<h4>Pedido ID: {{pedido}}</h3>

<div class="container text-center" >
    <table class="table">
        <thead class="thead-dark">
            <tr>
                <th>Producto</th>
                <th>Cantidad</th>
                <th>Precio</th>
            </tr>
        </thead>

        <tbody>
            {% for key, producto in carro.items %}
            <tr>
                <td>
                    {{producto.nombre}}
                </td>
                <td>
                    {{producto.cantidad}}
                </td>
                <td>
                    $: {{producto.precio}}
                </td>
            </tr>
            {% endfor %}
        
            <tr>
                <td colspan="3">Total: $: {{total}}</td>
            </tr>
        </tbody>
    </table>

</div>

<div class="container text-center">

    <a href="{% url 'home' %}" class="btn btn-outline-primary me-2">Volver</a>
    
    <!--pdf-->
    <form id="pdf_form" method="post" action="{% url 'generar_pdf' %}" style="display: none;">
        {% csrf_token %}
        <input type="hidden" name="pedido" value="{{ pedido }}">
        <input type="hidden" name="carro" value="{{ carro }}">
        <input type="hidden" name="total" value="{{ total }}">
    </form>
    
    <button id="pdf_button" class="btn btn-primary" type="submit">Descargar pdf</button>

</div>    


<!-- send form -->
<script>
    document.getElementById("pdf_button").addEventListener("click", function() {
        document.getElementById("pdf_form").submit();
    });
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>



А вот мой views.py:

def generar_pdf(request):
    if request.method == "POST":
        pedido = request.POST.get("pedido")
        carro_info = request.POST.get("carro")
        total_compra = request.POST.get("total")
        # if I print these 3 variables, the values are ok

        #--- here is the problem ---#
        html_string = render_to_string(
            template_name='exito.html',
            context={"pedido": pedido, "carro":carro_info, "total": total_compra},
            request=request)
        #------#
       
        html = HTML(string=html_string)

        pdf_file = html.write_pdf()

        response = HttpResponse(pdf_file, content_type='pdf')
        response['Content-Disposition'] = 'attachment; filename="mi_archivo.pdf"'
        return response

  • контекст:
  • pedido: экземпляр модели Pedido
  • carro_info: словарь: например, {'1': {'id_producto': 1, 'nombre': 'Destornillador', 'precio': 12.1, 'cantidad': 1, 'imagen': '/media/tienda/destornillador.png'}}
  • .
  • total_compra: поплавок
  • Картинки: template render

PDF html_string - это строка шаблона html, но без учета этих строк:

<tbody>
            {% for key, producto in carro.items %}
            <tr>
                <td>
                    {{producto.nombre}}
                </td>
                <td>
                    {{producto.cantidad}}
                </td>
                <td>
                    $: {{producto.precio}}
                </td>
            </tr>
            {% endfor %}
        
            <tr>
                <td colspan="3">Total: $: {{total}}</td>
            </tr>
        </tbody>

Причина этого в том, что render_to_string() не может получить доступ к элементам carro словаря.

Я думал, что это проблема оператора {% for %} или, возможно, просто словаря. Однако, когда я пытаюсь вывести в шаблоне что-то вроде: {{pedido.id}}, render_to_string() полностью игнорирует это утверждение.

Что я могу сделать? Нужно ли использовать другие функции django для преобразования шаблона в строку? Заранее спасибо.

Вернуться на верх