使用 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。

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

Peachly AI

Peachly AI是一个一体化的AI广告解决方案,帮助企业创建、定位和优化他们的广告活动。

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

查看详情 使用 HTMX 和 Django 动态更新按钮状态

前端 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 应用程序。

以上就是使用 HTMX 和 Djanjavascript java html js 前端 json go app ssl 后端 ai win django JavaScript django json html if 字符串 Event 对象 事件

javascript java html js 前端 json go app ssl 后端 ai win django JavaScript django json html if 字符串 Event 对象 事件

事件
上一篇
下一篇