В чем разница между рендерингом 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>