В чем разница между рендерингом full.html и partial.html с помощью django и htmx, особенно контекстной переменной

#views.py

def full(request):  
    form = ...  
    number = 1  
    context = {"form": form, 'number': number}  
    return render(request, full.html, context)  

def partial(request):  
    form = ...  
    number = 2  
    context = {"form": form, 'number': number}  
    return render(request, partial.html, context)  

В full.html {{ number }} остается 1. Это работает, как ожидалось.
В full.html, расширенном с помощью partial.html {{ number }} остается 1, не обновляется и 2.

Где контекст от частичного рендеринга?

Разница хорошо объяснена в библиотеке django-htmx docs.

Частичный вид рендеринга - это то же самое, что и полный, но рендеринг с использованием другого (более простого) шаблона. Поэтому возвращаемый контекст может быть одинаковым. Поэтому в вашем случае я бы рекомендовал объединить полное и частичное представления и просто различать шаблон:

from django.http import HttpRequest, HttpResponse
from django.shortcuts import render
from django.views.decorators.http import require_GET


@require_GET
def partial_rendering(request: HttpRequest) -> HttpResponse:
    if request.htmx:
        base_template = "_partial.html"
    else:
        base_template = "_base.html"

    ...

    return render(
        request,
        "page.html",
        {
            "base_template": base_template,
            # ...
        },
    )

Затем в шаблоне (page.html) используйте эту переменную в {% extends %}:

{% extends base_template %}

{% block main %}
  ...
{% endblock %}

Здесь _base.html будет основной базой сайта:

<!doctype html>
<html>
<head>
  ...
</head>
<body>
  <header>
    <nav>
      ...
    </nav>
  </header>
  <main id="main">
    {% block main %}{% endblock %}
  </main>
</body>

в то время как _partial.html будет содержать только минимальный элемент для обновления:

<main id="main">
  {% block main %}{% endblock %}
</main>
Вернуться на верх