问:如何让HTMX根据用户手动导航到的URL加载部分?
我正在使用HTMX加载HTML部分。所有的部分都来自它们自己的端点。因此,在本例中,它来自/h/library/1
,因为页面只是/library/1
我的URL模式如下:
urlpatterns = [
path("", views.logged_in_home),
path("library/<id>", views.logged_in_home),
path("h/library/<id>", views.show_library), # returns partial
]
加载库的按钮如下所示(这是从logged_in_home()
返回的:
<a
hx-get="/h/library/1"
hx-push-url="/library/1"
hx-target="#page-content"
hx-swap="innerHTML"
>
Load Library 1
</a>
<div id="page-content"></div>
# show_library url
def show_library(request, id)
return HttpResponse(f"Library {id} info.")
当我点击链接时,部分内容被正确加载到div中,url更新为/library/1
。然而,当我手动导航到/library/1
时,我得到了主页,但部分没有加载。
我到底做错了什么?我看到很多响应建议查看HTMX头文件,以确定应该发送回部分页面还是完整页面,但我认为我可以通过使用指定的API前缀(如/h/*
)来轻松地避开这个问题
1条答案
按热度按时间odopli941#
您的代码在设置时工作正常,但您将错误的URL用于部分通过。
如果你像现在这样访问
/library/1
,那么根据你的URL路径path("library/<id>", views.logged_in_home),
,logged_in_home视图将被触发,这就是为什么你看到的是登录页面,而不是部分页面。如果您转到
h/library/1
(* 注意开头的h)*,那么您确实应该看到partial正在自己加载并正常工作(因为您的URLpath("h/library/<id>", views.show_library)
将正确返回给定id的HttpResponse partial,因为它正确触发了show_library视图)。注意:这是您设置的站点的行为;它可能不是网站的“想要的”行为,在这种情况下,您可能需要重新检查您的视图/URL和模板。
FWIW,当结合HTMX和Django时,除非绝对必要,否则我个人不会使用
hx-push-url
,因为它会扰乱HTMX带给Django的“单页魔法”(如果我无论如何都要更改URL,那么我可能会用vanilla Django视图实现大部分需要的内容)。