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
: экземпляр модели Pedidocarro_info
: словарь: например, {'1': {'id_producto': 1, 'nombre': 'Destornillador', 'precio': 12.1, 'cantidad': 1, 'imagen': '/media/tienda/destornillador.png'}} .
total_compra
: поплавок
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 для преобразования шаблона в строку? Заранее спасибо.