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

如何在Django中动态重新渲染模板实现模型列表过滤?

解决Django动态筛选后页面不更新的问题

你遇到的核心问题是:当前的AJAX请求只完成了发送查询参数这一步,但完全没有处理后端返回的响应内容,也没有把新的列表渲染到页面上,所以页面才会毫无变化。下面给你一步步的解决方案:

1. 优化模板结构(可选但推荐)

为了更高效地做局部更新,建议把需要动态刷新的人员列表抽成单独的模板片段:
创建person_list.html文件,放入列表的核心代码:

<!-- person_list.html -->
<div class="list-group" id="list-tab" role="tablist">
    {% for person in persons %}
    <a class="list-group-item list-group-item-action" id="list-{{person.code}}" data-toggle="list" href="#" role="tab" aria-controls="{{person.code}}">{{person.code}}</a>
    {% endfor %}
</div>

然后在原view_data.html中引用这个片段:

<div class="col-4">
    {% include "person_list.html" %}
</div>

2. 修改视图,支持AJAX局部返回

让视图能区分普通请求和AJAX请求,分别返回完整页面或仅列表片段:

def view_data(request):
    text = request.GET.get('text')
    persons = []
    if text:
        try:
            # 注意:get()只会返回单个对象,如果要匹配多个结果,建议用filter()
            # 比如 persons = models.Person.objects.filter(code__regex=text)
            person = models.Person.objects.get(code__regex=text)
            persons.append(person)
        except (models.Person.DoesNotExist, models.Person.MultipleObjectsReturned):
            # 捕获不存在和匹配多个的异常,避免报错
            pass
    
    # 判断是否为AJAX请求(通过请求头识别)
    if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
        # AJAX请求仅返回列表片段
        return render(request, 'person_list.html', {'persons': persons})
    # 普通请求返回完整页面
    return render(request, 'view_data.html', {'persons': persons})

这里额外提醒:get()方法风险较高,如果有多个匹配code__regex的Person,会抛出MultipleObjectsReturned异常,建议根据需求换成filter()来获取所有匹配项。

3. 修改前端AJAX,处理响应并更新页面

现在要在AJAX请求的回调里,把后端返回的新列表替换到页面中:

// 可选:加防抖,避免每次按键都发请求,提升性能
let debounceTimer;
$( "#filter" ).keyup(function() {
    clearTimeout(debounceTimer);
    debounceTimer = setTimeout(function() {
        $.get("", {text: $('#filter').val()}, function(response) {
            // 把返回的新列表替换掉页面上旧的列表容器
            $('#list-tab').replaceWith(response);
        });
    }, 300); // 300毫秒内无新按键才发送请求
});

如果不想抽离模板片段,也可以让视图返回完整页面,然后在回调里提取列表部分再替换,但抽离片段的方式更轻量高效。

内容的提问来源于stack exchange,提问作者Attila Bognár

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:49:53