You need to enable JavaScript to run this app. Django如何实现按钮点击触发数据库角色等级值加1并同步页面更新
优惠活动
大模型
产品
解决方案
定价
更多

Django如何实现按钮点击触发数据库角色等级值加1并同步页面更新

角色等级+1同步更新实现方案

前置问题修复

你当前的主视图代码存在一个低级笔误,会直接导致页面渲染异常:

  • 原本取角色的代码.order_by('character_Name').first 是把QuerySet的first方法本身传入了模板,没有加括号执行,拿不到实际的角色对象。需要改成.first()才能正确获取当前用户对应的第一条角色数据。

分步实现功能

1. 新增独立的等级更新处理视图

不要把更新逻辑硬塞到现有main视图里,专门新建一个处理POST请求的视图负责等级递增,在views.py中追加代码:

from django.http import JsonResponse
from django.views.decorators.http import require_POST

@require_POST
def increase_character_level(request):
    # 校验登录状态
    if not request.user.is_authenticated:
        return JsonResponse({'status': 'error', 'msg': '未登录'}, status=403)
    # 取当前用户关联的角色
    character = Character.objects.filter(user=request.user).order_by('character_Name').first()
    if not character:
        return JsonResponse({'status': 'error', 'msg': '当前用户无关联角色'}, status=404)
    # 匹配模型定义的20级上限规则
    if character.level >= 20:
        return JsonResponse({'status': 'success', 'new_level': character.level, 'msg': '已达最高等级'})
    # 等级+1并落库,只更新level字段减少数据库开销
    character.level += 1
    character.save(update_fields=['level'])
    # 返回最新等级给前端做页面更新
    return JsonResponse({'status': 'success', 'new_level': character.level})

2. 补充对应路由

在urls.py的路由列表里加上刚才新建视图的访问路径:

path('increase-level', views.increase_character_level, name='increase_level'),

3. 改造前端页面实现点击交互

Django对POST请求默认做CSRF校验,需要先把CSRF Token传到前端的JS逻辑里,再实现按钮点击的异步请求逻辑,改造后的main.html代码如下:

<!DOCTYPE html>
<html lang="zh-CN">
<body>
  {% csrf_token %}
  <h1>{{ characters.character_Name }}</h1>
  <h4>Level: <span id="level-text">{{ characters.level }}</span></h4>
  <button onclick="increase_level()"> + 1 </button>

  <script>
    // 从模板渲染的隐藏input里读取CSRF Token
    const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value;
    async function increase_level() {
      // 发起异步POST请求到更新接口
      const res = await fetch("{% url 'increase_level' %}", {
        method: 'POST',
        headers: {
          'X-CSRFToken': csrfToken
        }
      })
      const result = await res.json()
      if (result.status === 'success') {
        // 拿到返回的最新等级,直接更新页面上的文本,无需整页刷新
        document.querySelector('#level-text').innerText = result.new_level
      } else {
        alert(result.msg)
      }
    }
  </script>
</body>
</html>

实现效果说明

  • 点击按钮后直接向后端发更新请求,数据库里的角色等级会在原有值基础上+1
  • 后端返回最新等级后前端会直接替换显示文本,不需要整页重载,交互流畅
  • 全程匹配你模型里定义的规则:最高20级的限制、用户和角色的关联校验、未登录拦截
  • 数据库更新只提交level字段,比全字段保存效率更高

内容的提问来源于stack exchange,提问作者a_regular_pear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.09 01:36:05