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

使用Django SimpleListFilter自定义过滤器遇ValueError错误求助

Django自定义输入过滤器ValueError修复方案

错误原因

报错ValueError: not enough values to unpack (expected 2, got 0)的根源在你的choices方法中:

for lookup, title in self.lookup_choices:

你的lookups方法返回(() ,),这是一个包含空元组的元组,导致self.lookup_choices的每个元素都是空元组,无法拆分成lookup和title两个变量,触发拆包失败。

而且你额外重写的choices方法完全是多余的——输入型过滤器依赖自定义模板渲染输入框,不需要生成下拉选项的逻辑,这和你参考的教程逻辑不符。

修复步骤

直接删除choices方法,并修正lookups的返回值(改为空元组更合理),修改后的filters.py代码如下:

from django.contrib import admin
from django.db.models import Q

class InputFilter(admin.SimpleListFilter):
    title = 'Language'
    parameter_name = 'language'
    template = 'admin/input_filter.html'

    def lookups(self, request, model_admin):
        # 空返回值仅用于让过滤器显示在页面上
        return ()

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(Q(language__icontains=self.value()))

额外验证

确保你的admin/input_filter.html模板内容正确,示例模板结构如下(适配输入过滤器需求):

{% load i18n %}
<h3>{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}</h3>
<ul>
    <li>
        <form method="get">
            {% for k, v in request.GET.items %}
                {% if k != parameter_name %}
                    <input type="hidden" name="{{ k }}" value="{{ v }}">
                {% endif %}
            {% endfor %}
            <input type="text" name="{{ parameter_name }}" value="{{ value|default:'' }}">
            <button type="submit">{% trans 'Search' %}</button>
            {% if value %}
                <a href="{{ request.path }}">{% trans 'Clear' %}</a>
            {% endif %}
        </form>
    </li>
</ul>

修改完成后重启服务,访问admin页面即可正常使用输入过滤器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:33:15