Что может заставить один и тот же блок include шаблона Django вести себя по-разному дважды на одной и той же странице?

Я пытаюсь includeпростой шаблон пагинации в шаблоне, который перечисляет записи блога, но он выводится без интерпретации, т.е. я вижу двойной тег, заключенный в фигурные скобки, как текст на результирующей веб-странице (см. изображение ниже).

Странно, но когда я также вставляю тот же блок выше на странице, и он интерпретируется нормально. Один и тот же include, дважды на одной и той же странице, разное поведение!

Между ними я выполняю итерации над одним и тем же объектом, который передается шаблону пагинации, так что, возможно, я чего-то не понимаю в состоянии этого объекта? Или процесс рендеринга Django.

{% extends "blog/base.html" %} 
{% block title %}My blog site thing{% endblock %}
{% block content %}
    <h1>Blog site</h1>
    {% include 'pagination.html' with page_object=posts %} 
    {% for post in posts %}
        <h2><a href="{{post.get_absolute_url}}">{{ post.title }}</a></h2>
        <p class="date">Published {{post.publish}} by {{post.author}}</p>
        {{post.body|truncatewords:5|linebreaks}}
    {% endfor %}
    {% include 'pagination.html' with page_object=posts %}
    {% endblock %}

Pagination.html

<div class="pagination">
  <span class="step-links">
    {% if page_object.has_previous %}
    <a href="?page={{ page_object.previous_page_number }}">Previous</a>
    {% endif %}
    <span class="current">
      Page {{ page_object.number }} of {{ page_object.paginator.num_pages }}.
    </span>
    {% if page_object.has_next %}
    <a href="?page={{ page_object.next_page_number }}">Next</a>
    {% endif %}
  </span>
</div>

views.py для этого приложения

from django.shortcuts import render, get_object_or_404
from .models import Post
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger


def post_list(request):
    object_list = Post.published.all()
    paginator = Paginator(object_list, 3)
    page = request.GET.get('page')
    try:
        posts = paginator.page(page)
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)
    
    return render(request, 'blog/post/list.html', {'posts':posts})

def post_detail(request, year, month, day, post):
    post = get_object_or_404(Post, slug=post, status='published',publish__year=year,publish__month=month, publish__day=day)
    return render(request, 'blog/post/detail.html', {'post':post})

Вот как выглядит полученная страница: Screenshot of the page render via the html below

Вот результирующий html (я добавил дополнительную строку вокруг ошибочного вывода, чтобы выделить его)

<!DOCTYPE html>
<html>
  <head>
    <title>My blog site thing</title>
    <link href="/static/css/blog.css" rel="stylesheet">
  </head>
</html>
<body>
  <div id="content">
<h1>Blog site</h1>
<div class="pagination">
  <span class="step-links">
    
    <span class="current">
      Page 1 of 2.
    </span>
    
    <a href="?page=">Next</a>
    
  </span>
</div>
 
<h2><a href="/blog/2022/3/2/another-glorious-post/">Another glorious post</a></h2>
<p class="date">Published March 2, 2022, 9:26 p.m. by admin</p>
<p>Lorem ipsum text Lorem ipsum …</p> 
<h2><a href="/blog/2022/3/2/classy-post/">Classy post</a></h2>
<p class="date">Published March 2, 2022, 9:25 p.m. by admin</p>
<p>This is the way</p> 
<h2><a href="/blog/2022/3/1/another-post/">Another post</a></h2>
<p class="date">Published March 1, 2022, 7:26 a.m. by admin</p>
<p>Xyz</p>  

{% include 'pagination.html' with page_object=posts %}

</div>
  <div id="sidebar">
    <h2>My blog</h2>
    <p>This is my blog.</p>
  </div>
</body>

Я даже вернулся и скопировал фактический код из книги, которой я следую (Django 3 на примере, Антонио Меле), и он идентичен!

Любая добрая душа, которая дочитала до этого момента, скажите, что я упустил?

Ok, так что я просто понял, что происходит, и делюсь на случай, если это будет полезно кому-то еще.

Моя IDE искажала форматирование файла шаблона при сохранении.

Итак, первое включение было идеальным маленьким

{% include 'pagination.html' with page=posts %}

Второй в итоге выглядел как

{% include 
    'pagination.html' with page=posts %}

Когда я отключил автоформатирование и исправил пробелы, он отобразился нормально.

Итак, мое большое открытие - возможно, очевидное для многих - состоит в том, что пробелы имеют значение в тегах шаблонов django! .

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