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

Django中AJAX级联下拉框查询结果为空,求排查解决

Django AJAX级联下拉框查询结果为空的问题排查与解决

1. 模型管理器被覆盖导致查询失效

你的Fabri模型中设置了objects = None,这会覆盖Django默认的模型管理器objects,直接导致无法执行任何数据库查询操作。

解决方案:
删除objects = None这一行,恢复Django默认的模型管理器:

class Fabri(models.Model):
    NAME = models.CharField(max_length=100)

    def __str__(self):
        return self.NAME

2. 视图参数处理逻辑错误

视图中selected_grade = request.GET.get('MARKE')[0].split(",")存在严重逻辑问题:

  • 如果前端传递的是单个选项值(比如"GradeA"),[0]会取字符串的第一个字符(比如"G"),再通过split(",")得到仅包含单个字符的列表
  • 后续用NAME__icontains=selected_grade查询时,icontains要求传入字符串而非列表,完全不符合查询条件

解决方案:
根据实际场景调整参数处理逻辑:

  • 若为单个选项值,直接获取参数即可:
def get_fabri_options(request):
    if request.method == 'GET':
        selected_grade = request.GET.get('MARKE')
        if selected_grade:
            try:
                fabri_options = Fabri.objects.filter(NAME__icontains=selected_grade).values_list('NAME', flat=True)
                logger.info(f'查询结果: {fabri_options}')
                return JsonResponse(list(fabri_options), safe=False)
            except Exception as e:
                traceback.print_exc()
                return JsonResponse({'error': 'An error occurred'}, status=500)
        else:
            return JsonResponse({'error': 'No grade provided'}, status=400)
    else:
        return JsonResponse({'error': 'Invalid request'}, status=400)
  • 若前端传递的是逗号分隔的多值字符串,使用split(",")后需改用__in查询(icontains不支持列表参数):
selected_grade = request.GET.get('MARKE').split(",")
fabri_options = Fabri.objects.filter(NAME__in=selected_grade).values_list('NAME', flat=True)

3. 前端AJAX冗余配置与渲染错误

  • GET请求无需设置contentType: "application/json; charset=utf-8",该配置仅针对POST请求的请求体,多余设置可能引发潜在问题
  • 原代码中$('#fabri_select').html(data)会直接将JSON数组转为字符串显示,无法正确渲染下拉选项

解决方案:
调整AJAX代码,删除冗余配置并生成正确的<option>标签:

if (selectedGrade) {
    $.ajax({
        type: "GET",
        url: "/get_fabri_options",
        headers: { "X-CSRFToken": csrftoken },
        data: {
            'MARKE': selectedGrade
        },
        dataType: "json",
        success: function(data) {
            let options = '<option value="">请选择</option>';
            data.forEach(item => {
                options += `<option value="${item}">${item}</option>`;
            });
            $('#fabri_select').html(options);
        },
        error: function(xhr, textStatus, error){
            console.log(error)
        }
    });
}

4. 验证参数传递正确性

在视图中添加日志打印,确认接收到的参数是否与前端一致:

logger.info(f'接收到的MARKE参数: {request.GET.get("MARKE")}')

同时在浏览器开发者工具的Network标签中查看AJAX请求URL,确认参数是否正确附加(比如/get_fabri_options?MARKE=GradeX)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:34:52