使用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
相关产品推荐
相关产品推荐

