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

如何在Django模板中使用objects.filter?附项目模型代码

在Django模板中使用filter的正确姿势

嘿,我来给你理清楚这个问题——其实Django模板本身不允许直接调用objects.filter()这类查询方法,这是框架刻意设计的:模板的职责是专注于内容展示,数据的筛选、处理逻辑应该放在视图层(或者模型管理器)里完成,再把处理好的数据传递给模板渲染。下面是具体的实现步骤:

1. 先在视图中完成过滤逻辑

所有的filter操作都应该写在views.py里,举几个常见的例子:

例子1:获取当前用户的所有专辑

# views.py
from django.shortcuts import render
from .models import Album
from django.contrib.auth.decorators import login_required

# 要求用户登录才能访问
@login_required
def user_albums(request):
    # 用filter筛选出当前用户的专辑
    user_albums = Album.objects.filter(owner=request.user)
    # 将查询结果传递给模板,键名可以自定义
    return render(request, 'albums/user_albums.html', {'user_albums': user_albums})

例子2:按艺术家名称筛选专辑

def artist_albums(request, artist_name):
    # 用__icontains做模糊匹配(不区分大小写)
    target_albums = Album.objects.filter(artist__icontains=artist_name)
    return render(request, 'albums/artist_albums.html', {'albums': target_albums})

例子3:根据用户搜索关键词动态过滤

如果需要让用户输入关键词搜索,可以通过GET参数获取查询条件:

def search_albums(request):
    # 获取URL中的q参数,默认空字符串
    search_query = request.GET.get('q', '')
    # 同时匹配专辑标题和艺术家名称
    matched_albums = Album.objects.filter(
        title__icontains=search_query
    ) | Album.objects.filter(
        artist__icontains=search_query
    )
    return render(request, 'albums/search_results.html', {
        'albums': matched_albums,
        'search_query': search_query
    })

2. 在模板中展示过滤后的结果

把视图传递过来的查询集用模板标签遍历展示即可:

基础遍历示例(对应例子1)

<!-- templates/albums/user_albums.html -->
<h2>你的专辑收藏</h2>
{% if user_albums %}
    <ul class="album-list">
        {% for album in user_albums %}
            <li>
                <h3>{{ album.title }}</h3>
                <p>艺术家:{{ album.artist }}</p>
                <p>发行日期:{{ album.release_date|date:"Y-m-d" }}</p>
                {% if album.logo %}
                    <img src="{{ album.logo.url }}" alt="{{ album.title }} 封面" width="100">
                {% else %}
                    <img src="/media/album_logos/no-image.jpeg" alt="默认封面" width="100">
                {% endif %}
            </li>
        {% endfor %}
    </ul>
{% else %}
    <p>你还没有添加任何专辑哦~</p>
{% endif %}

动态搜索的模板示例(对应例子3)

<!-- templates/albums/search_results.html -->
<form method="get" action="{% url 'search_albums' %}">
    <input type="text" name="q" placeholder="搜索专辑或艺术家..." value="{{ search_query }}">
    <button type="submit">搜索</button>
</form>

{% if albums %}
    <p>找到 {{ albums.count }} 个匹配结果:</p>
    <ul>
        {% for album in albums %}
            <li>{{ album.title }} - {{ album.artist }}</li>
        {% endfor %}
    </ul>
{% elif search_query %}
    <p>没有找到匹配的专辑😢</p>
{% endif %}

关于“能不能直接在模板里用filter”的补充

虽然Django不允许直接在模板中调用objects.filter(),但你可以通过模板的{% if %}标签在已有的查询集里做简单的内存过滤,比如:

<!-- 只显示艺术家为"Radiohead"的专辑 -->
{% for album in user_albums %}
    {% if album.artist == "Radiohead" %}
        <li>{{ album.title }}</li>
    {% endif %}
{% endfor %}

⚠️ 但要注意:这种方式是在已经从数据库取出的数据集里做过滤,效率远不如在视图中用filter做数据库层面的筛选,数据量大的时候会明显变慢,所以非常不推荐这种写法,尽量把过滤逻辑放在视图里。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:02:42