值得一看
广告
彩虹云商城
广告

热门广告位

使用 HTMX 和 Django 动态更新按钮状态

使用 htmx 和 django 动态更新按钮状态

本文旨在指导开发者如何结合 HTMX 和 Django,实现点击按钮后,根据服务器端返回的状态动态更新按钮的显示效果。重点在于解决 HTMX 替换按钮元素后,JavaScript 无法正确引用更新后的按钮的问题,并提供后端 Django 视图的正确实现方式。

前端 HTML 结构

首先,我们需要一个包含按钮的表单。这个表单使用 HTMX 的 hx-post 属性指定提交的 URL,该 URL 对应于 Django 视图。

<form id="follow-form" hx-post="{% url 'main:follow_toggle' account.id %}">
{% csrf_token %}
{% if request.user in account.followers.all %}
<button type="submit" id="follow-button" class="btn btn-secondary rounded-pill">עוקב</button>
{% else %}
<button type="submit" id="follow-button" class="btn btn-success rounded-pill">עקוב</button>
{% endif %}
</form>

在这个例子中,按钮的初始状态取决于当前用户是否已关注该账户。

后端 Django 视图

Django 视图负责处理表单提交,更新用户关注状态,并返回包含新状态的 JSON 响应。

import json
from django.http import HttpResponse, JsonResponse
from django.shortcuts import get_object_or_404
from django.views import generic
from .models import Account  # 假设 Account 模型在 .models 中
class FollowToggleView(generic.View):
def post(self, request, account_id):
user_to_toggle = get_object_or_404(Account, id=account_id)
is_following = False  # 初始化 is_following 变量
if user_to_toggle in request.user.following.all():
request.user.unfollow(user_to_toggle)
is_following = False
else:
request.user.follow(user_to_toggle)
is_following = True
# 返回 JSON 响应
return JsonResponse({'is_following': is_following})

关键在于,视图应该返回一个 JSON 响应,包含一个 is_following 字段,指示用户是否已关注该账户。 JsonResponse 会自动设置 Content-Type 为 application/json。

Supercreator

Supercreator

AI视频创作编辑器,几分钟内从构思到创作。

Supercreator59

查看详情
Supercreator

前端 JavaScript 代码

JavaScript 代码监听 HTMX 的 htmx:afterSwap 事件,并在表单提交后更新按钮的文本和样式。

document.addEventListener('htmx:afterSwap', (event) => {
// 在事件目标中查找按钮
const followButton = event.target.querySelector('#follow-button');
if (followButton) {
// 解析 JSON 响应
const response = JSON.parse(event.detail.xhr.response);
if (response.is_following) {
followButton.innerText = 'עוקב';
followButton.classList.remove('btn-success');
followButton.classList.add('btn-secondary');
} else {
followButton.innerText = 'עקוב';
followButton.classList.remove('btn-secondary');
followButton.classList.add('btn-success');
}
}
});

关键点:

  1. event.target.querySelector(‘#follow-button’): 使用 event.target (即触发事件的元素,这里是 form) 作为上下文来查找 #follow-button。 这确保了即使按钮被 HTMX 替换,也能找到新的按钮元素。
  2. JSON.parse(event.detail.xhr.response): 从 event.detail.xhr.response 获取服务器返回的原始字符串,并使用 JSON.parse 将其解析为 JavaScript 对象。
  3. 错误处理: 增加 if (followButton)判断,确保在按钮存在时才执行后续操作,避免潜在的错误。

注意事项

  • 确保 Django 视图返回的是有效的 JSON 响应,并且包含 is_following 字段。
  • 在 JavaScript 代码中使用 event.target.querySelector 查找按钮,以确保即使按钮被 HTMX 替换,也能找到正确的元素。
  • 检查服务器返回的 Content-Type 是否为 application/json,否则需要手动解析response。

总结

通过结合 HTMX 和 Django,我们可以轻松实现动态更新按钮状态的功能。关键在于正确处理 HTMX 替换元素后的 JavaScript 引用问题,并确保 Django 视图返回正确的 JSON 响应。 遵循上述步骤,可以有效地构建交互性更强的 Web 应用程序。

相关标签:

javascript java html js 前端 json go app ssl 后端 ai win django JavaScript django json html if 字符串 Event 对象 事件
温馨提示: 本文最后更新于2025-09-07 10:38:58,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞12赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容