django 基于URL的HTMX加载部分

i2loujxw  于 2023-05-13  发布在  Go
关注(0)|答案(1)|浏览(163)

问:如何让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/*)来轻松地避开这个问题

odopli94

odopli941#

您的代码在设置时工作正常,但您将错误的URL用于部分通过。
如果你像现在这样访问/library/1,那么根据你的URL路径path("library/<id>", views.logged_in_home),logged_in_home视图将被触发,这就是为什么你看到的是登录页面,而不是部分页面。
如果您转到h/library/1(* 注意开头的h)*,那么您确实应该看到partial正在自己加载并正常工作(因为您的URL path("h/library/<id>", views.show_library)将正确返回给定id的HttpResponse partial,因为它正确触发了show_library视图)。
注意:这是您设置的站点的行为;它可能不是网站的“想要的”行为,在这种情况下,您可能需要重新检查您的视图/URL和模板。
FWIW,当结合HTMX和Django时,除非绝对必要,否则我个人不会使用hx-push-url,因为它会扰乱HTMX带给Django的“单页魔法”(如果我无论如何都要更改URL,那么我可能会用vanilla Django视图实现大部分需要的内容)。

相关问题