{% url ... %} templatetag в шаблоне Django included не видит переменную
У меня странное поведение в включенном шаблоне, которое я не могу понять.
urls.py
urlpatterns = (
path(
"items/",
views.list_view,
name="list-view",
),
path(
"item/<int:pk>/",
views.detail_view,
name="detail-view",
),
)
views.py
def list_view(request):
items = Item.objects.all()
return render(request, "parent_template.html", context={"items": items})
def detail_view(request, pk):
item = get_object_or_404(Item, pk=pk)
return render(request, "detail_template.html", context={"item": item}
parent_template.html
{% for item in items %}
Parent: {{ item.pk }}
{% include 'child_template.html' %}
{% endfor %}
child_template.html
Child: {{ item.pk }}
URL: {% url 'detail-view' item.pk %}
Я получаю обратную ошибку:
Reverse for '/test/url/<int:pk>/' with arguments '('',)' not found. 1 pattern(s) tried: ['test/url/(?P<pk>[0-9]+)/\\Z']
Если я удалю тег шаблона {% url ... %}, он отображается правильно и показывает:
Родитель: 1 Ребенок: 1
Итак, ясно, что элемент находится в контексте, но по какой-то причине он не передается в templatetag.
Я также пробовал такие варианты, как:
{% for item in items %}
{% with new_item=item %}
{% include 'child_template.html' %}
{% endwith %}
{% endfor %}
Есть идеи?
Я использую Django 3.2.12
Я только что нашел ошибку - я искал не в том месте. Мой полный код выглядел следующим образом:
parent.html
<!-- {% include 'child_template.html' %} -->
{% for item in items %}
{% with new_item=item %}
{% include 'child_template.html' %}
{% endwith %}
{% endfor %}
Я не обратил внимания на HTML-комментарий в верхней части шаблона. Очевидно, что Django все еще рендерит код на стороне сервера и в этот момент не имеет элемента в своем контексте.