在 Django 中使用 htmx 向特定 url 发出 post 请求时未找到错误 url
Getting error not found url while making post request to specific url with htmx in Django
我在不刷新页面的情况下对我的博客进行类似的操作。但是出现错误 [06/Apr/2022 20:48:26] "POST /like/post/4/ HTTP/1.1" 404 3945
这是我做的
base.html 具有 htmx 设置
<!-- Load from unpkg -->
<script src="https://unpkg.com/htmx.org@1.7.0"></script>
<script>
document.body.addEventListener('htmx:configRequest', (e) => {
e.detail.headers['X-CSRFToken'] = '{{ csrf_token }}';
})
</script>
views.py
def add_like_post(request, pk):
post = get_object_or_404(Post, id=request.POST.get('post_id'))
post.likes.add(request.user)
return HttpResponseRedirect(post.get_absolute_url())
urls.py
urlpatterns += [
path('like/post/<int:pk>/', add_like_post, name='like-post'),
]
post-detail.html
{#<form method="post" action="{% url 'like-post post.id %}">{% csrf_token %}#}
<button hx-post="{% url 'like-post' post.id %}" hx-target="#likes" id="likes" hx-swap="outerHTML" class="btn btn-block btn-outline-secondary btn-lg mb-2 mx-auto" name="post_id" value="{{ post.id }}"><i class="fa fa-thumbs-up"> L i k e - {{ post.number_of_likes }}</i></button>
{# </form>#}
当我从按钮中删除 htmx 设置并添加 type='submit'
并取消注释 form 时,它工作正常。
有没有我做错了什么
按钮元素不是表单元素,因此 HTMX 不会将其包含在 post 请求中。但是,目标 URL 中已经有 post_id
数据,因此您可以在视图函数中使用它:
post = get_object_or_404(Post, id=pk)
或者,您可以使用 post_id
放置一个隐藏元素,并通过 hx-include
attribute 将其包含在请求中。
<input type="hidden" name="post_id" value="{{ post.id }}" />
<button hx-post="{% url 'like-post' post.id %}"
hx-target="#likes"
id="likes"
hx-swap="outerHTML"
hx-include="[name='post_id']"
class="btn btn-block btn-outline-secondary btn-lg mb-2 mx-auto">
<i class="fa fa-thumbs-up"> L i k e - {{ post.number_of_likes }}</i>
</button>
我在不刷新页面的情况下对我的博客进行类似的操作。但是出现错误 [06/Apr/2022 20:48:26] "POST /like/post/4/ HTTP/1.1" 404 3945
这是我做的
base.html 具有 htmx 设置
<!-- Load from unpkg -->
<script src="https://unpkg.com/htmx.org@1.7.0"></script>
<script>
document.body.addEventListener('htmx:configRequest', (e) => {
e.detail.headers['X-CSRFToken'] = '{{ csrf_token }}';
})
</script>
views.py
def add_like_post(request, pk):
post = get_object_or_404(Post, id=request.POST.get('post_id'))
post.likes.add(request.user)
return HttpResponseRedirect(post.get_absolute_url())
urls.py
urlpatterns += [
path('like/post/<int:pk>/', add_like_post, name='like-post'),
]
post-detail.html
{#<form method="post" action="{% url 'like-post post.id %}">{% csrf_token %}#}
<button hx-post="{% url 'like-post' post.id %}" hx-target="#likes" id="likes" hx-swap="outerHTML" class="btn btn-block btn-outline-secondary btn-lg mb-2 mx-auto" name="post_id" value="{{ post.id }}"><i class="fa fa-thumbs-up"> L i k e - {{ post.number_of_likes }}</i></button>
{# </form>#}
当我从按钮中删除 htmx 设置并添加 type='submit'
并取消注释 form 时,它工作正常。
有没有我做错了什么
按钮元素不是表单元素,因此 HTMX 不会将其包含在 post 请求中。但是,目标 URL 中已经有 post_id
数据,因此您可以在视图函数中使用它:
post = get_object_or_404(Post, id=pk)
或者,您可以使用 post_id
放置一个隐藏元素,并通过 hx-include
attribute 将其包含在请求中。
<input type="hidden" name="post_id" value="{{ post.id }}" />
<button hx-post="{% url 'like-post' post.id %}"
hx-target="#likes"
id="likes"
hx-swap="outerHTML"
hx-include="[name='post_id']"
class="btn btn-block btn-outline-secondary btn-lg mb-2 mx-auto">
<i class="fa fa-thumbs-up"> L i k e - {{ post.number_of_likes }}</i>
</button>