用django和htmx渲染full.html和partial.html有什么区别,尤其是上下文变量



这些都是演示的组成部分。

#views.py

def full(request):
template_name = "htmxx/full.html"
number        = 0
form          = Number(request.POST or None, auto_id='id_%s'+str(number))
context       = {"form": form, 'number': number }
print("context  :", context)
if request.method == "POST":
pprint.pprint(request.POST.lists())
return render(request, template_name, context)
def partial(request, zn):
template_name = "htmxx/partial.html"
number        = zn + 1
form          = Number(auto_id='id_%s'+str(number))
context       = {"form": form, 'number': number }
print('context  :', context)
return render(request, template_name, context)
urlpatterns = [
path(''                 , views.nav     , name='nav'    ),
path('nav'              , views.nav     , name='nav'    ),
path('full'             , views.full    , name='full'   ),
path('partial/<int:zn>' , views.partial , name='partial'),
]

#full.html

...
<div class="resp-table">
<div class="resp-table-row">
<form class="resp-table-row" action="{% url 'full' %}" method="POST">
{% csrf_token %}
<div id="numberadd" >
<ul>
<li>
{% include "./partial.ht ml" %}
</li>
</ul>
</div>
<button class="table-header-cell" type="submit">input form</button>
</form>
</div>

<div class="resp-table-header">
<button class="table-header-cell" 
hx-get="{% url 'partial' zn=number %}" hx-target="#numberadd" hx-swap="beforeend" type="button">
create form  
</button>
</div>

</div>
{% endblock %}

#部分.ht ml

{% for field in form %}                         
{{ field }}
{% end_for %}

在full.html中{{number}}为1。它按预期工作。在full.html中,用partial.ht ml{{number}}扩展为1,而不是更新为2。

局部渲染的上下文在哪里?

django-htmx库文档中很好地解释了这种区别。

部分渲染视图与完全渲染视图相同,但使用不同(更简单(的模板进行渲染。因此,返回的上下文可以是相同的。因此,在您的情况下,我建议合并完整和部分视图,并只区分模板:

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(中,在{%extensions%}:中使用该变量

{% 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>

最新更新