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

Django中用Ajax实现实时数据显示遇QuerySet无body属性错误

Django Ajax实时数据显示问题排查与解决

错误原因拆解

  1. QuerySet属性访问错误:视图中Question.objects.filter(body=body)返回的是QuerySet对象集合,并非单个Question实例,直接调用.body会触发'QuerySet' object has no attribute 'body'的500服务器错误。
  2. 前端未传递关键数据:Ajax请求的data参数为空,没有将用户输入内容传给后端,导致后端无法匹配对应数据。
  3. 触发逻辑不符合需求:当前用setInterval定时发起请求,无法实现"用户输入时实时显示"的效果,应改为监听输入事件触发请求。

修复步骤

1. 修正视图函数

将filter()改为get()(匹配单个对象)或filter().first()(取第一个匹配对象),同时处理数据不存在的异常:

from django.http import JsonResponse
from .models import Question
from django.core.exceptions import ObjectDoesNotExist

def get_real_time_data(request):
    if request.method == 'POST':
        body = request.POST.get('body', '')
        if not body:
            return JsonResponse({'error': '请输入内容'}, status=400)
            
        try:
            # 匹配单个对象,捕获数据不存在的异常
            question = Question.objects.get(body=body)
            return JsonResponse({'content': question.body})
        except ObjectDoesNotExist:
            return JsonResponse({'error': '未找到匹配内容'}, status=404)
        except Exception as e:
            return JsonResponse({'error': str(e)}, status=500)
    else:
        return JsonResponse({'error': '请求方法无效'}, status=400)

2. 修复前端Ajax逻辑

修改JavaScript代码,监听输入框的input事件,实时获取输入内容并发送请求,同时补充传递用户输入数据:

<div class="container">
    <div class="row">
        <div class="col">
            <div class="card">
                <div class="card-body">
                    <form action="" method="post">
                        {{ form }}
                        <div id="id_value"></div>
                        <input type="submit" class="btn btn-primary">
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
    function getCookie(name) {
        let cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            const cookies = document.cookie.split(';');
            for (let i = 0; i < cookies.length; i++) {
                const cookie = cookies[i].trim();
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }

    $(document).ready(function() {
        // 绑定输入框与显示区域(Django ModelForm默认生成的body字段id为id_body)
        const $bodyInput = $('#id_body');
        const $displayArea = $('#id_value');
        const csrfToken = getCookie('csrftoken');

        function updateRealTimeData() {
            const inputContent = $bodyInput.val().trim();
            if (!inputContent) {
                $displayArea.text('');
                return;
            }

            $.ajax({
                url: "{% url 'get_real_time_data' %}",
                type: 'POST',
                dataType: 'json',
                headers: {'X-CSRFToken': csrfToken},
                data: {body: inputContent}, // 传递用户输入内容
                success: function(data) {
                    $displayArea.text(data.content);
                },
                error: function(xhr, status, error) {
                    const response = JSON.parse(xhr.responseText);
                    $displayArea.text(response.error || '请求失败');
                }
            });
        }

        // 添加防抖,避免频繁请求(用户输入停止300ms后再发起请求)
        let debounceTimer;
        $bodyInput.on('input', function() {
            clearTimeout(debounceTimer);
            debounceTimer = setTimeout(updateRealTimeData, 300);
        });
    });
</script>

3. 可选优化:模糊匹配场景

如果需要实现"输入部分内容匹配相关数据"的效果,可将视图中的匹配逻辑改为模糊查询:

questions = Question.objects.filter(body__icontains=body)
content_list = [q.body for q in questions]
return JsonResponse({'content': ';'.join(content_list) if content_list else '未找到匹配内容'})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:54:56