You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Django视图添加Ajax实现无刷新切换布尔字段状态

Django Ajax实现无刷新切换Workout模型active字段问题

我在Django项目中尝试通过POST请求将Workout模型的active布尔字段从False切换为True。原本按钮功能正常,但希望点击时页面不刷新,因此尝试使用Ajax,却一直收到状态为error的400错误请求,不知原因。


最初的尝试

视图代码

def change_status(request, id):
    if request.is_ajax() and request.method == 'POST':
        startsession = Workout.objects.get(id=id)
        startsession.active = True if request.POST.get('active') == 'true' else False
        startsession.save()
        data = {'status': 'success', 'active': startsession.active}
        return JsonResponse(data, status=200)
    else:
        data = {'status': 'error'}
        return JsonResponse(data, status=400)

模板代码

<div>
  {% if object.active %}
    <button disabled  type="button">Start the workout</button>
  {% else %}
      <a href="{% url 'my_gym:bla' object.id %}">
      <button id="customSwitches" onclick="start();" type="button">Start the workout</button>
      </a>
  {% endif %}
</div>

Ajax脚本代码

<script>
            $(document).ready(function()
            $("#customSwitches").on('click', function () {
              $.ajax({
                url: "{% url 'my_gym:bla' object.id %}",
                data: {
                  csrfmiddlewaretoken: "{{ csrf_token }}",
                  active: this.disabled
                },
                type: "POST",
                dataType: 'json',

              });
              .done(function(data) {
                  console.log(data);
              })
              .always(function() {
                  console.log('[Done]');
              })
            })
            });
</script>

可正常工作但会刷新页面的视图代码

def change_status(request, id):
    url = request.META.get('HTTP_REFERER')  # 获取上一页URL
    startsession = Workout.objects.get(id=id)
    startsession.active = True
    startsession.save()
    return HttpResponseRedirect(url)

更新后的尝试(无响应)

视图代码

def change_status(request,id):
    # startsession = get_object_or_404(ActiveSession, id=id)
    startsession = Workout.objects.get(id=id)
    startsession.active = True
    startsession.save()
    context = {
        'startsession': startsession,
    }
    if request.is_ajax:
        html = render_to_string('my_gym/start_workout.html', context, request=request)
        return JsonResponse({'form': html})

模板及脚本代码

{{ object.active }}
    <div id="startworkout">
      <form action="{% url 'my_gym:bla' object.id %}" method='post'>
          {% csrf_token %}
              {% if object.active %}
              <button disabled  type="button" class="mt-3 btn btn-dark btn-block mb-4 ripple-surface">Start the workout</button>
              {% else %}
                <button id="customSwitches" onclick="start();" type="button" class="mt-3 btn btn-dark btn-block mb-4 ripple-surface">Start the workout</button>
              {% endif  %}
      </form>
    </div>

    <script type="text/javascript">
        $(document).ready(function(event){     <-------- 错误位置
            $(document).on('click','#customSwitches', function(event){
                event.preventDefault();
                var id= $(this).attr('value');
                $.ajax({
                    type:'POST',
                    url:'{% url 'my_gym:bla' object.id %}',
                    data:{'id': id, 'csrfmiddlewaretoken':'{{csrf_token}}'},
                    dataType:'json',
                    success:function(response){
                        $('#startworkout').html(response['form'])
                        console.log($('#startworkout').html(response['form']));
                    },
                    error:function(rs, e){
                        console.log(rs.responseText);
                    },
                });
            });
        });
    </script>

控制台报错

Uncaught ReferenceError: $ is not defined at (index):145:9

该错误与$(document).ready(function(event){代码行相关。


需求

寻求解决方案:如何为Django视图添加Ajax,实现点击按钮时页面不刷新。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:40:16