我最终在这里混合使用了最佳解决方案和此代码段。
但是,我不得不稍微调整一下代码片段,删除字段类型限制并添加新的field_path,该功能最近在1.3中添加。
from django.contrib.admin.filterspecs import FilterSpecfrom django.db import modelsfrom django.utils.safestring import mark_safefrom django.utils.translation import ugettext as _class NullFilterSpec(FilterSpec): #fields = (models.CharField, models.IntegerField, models.FileField) @classmethod def test(cls, field): #return field.null and isinstance(field, cls.fields) and not field._choices return field.null and not field._choices #test = classmethod(test) def __init__(self, f, request, params, model, model_admin, field_path=None): super(NullFilterSpec, self).__init__(f, request, params, model, model_admin, field_path) self.lookup_kwarg = '%s__isnull' % f.name self.lookup_val = request.GET.get(self.lookup_kwarg, None) def choices(self, cl): # bool(v) must be False for IS NOT NULL and True for IS NULL, but can only be a string for k, v in ((_('All'), None), (_('Has value'), ''), (_('Omitted'), '1')): yield { 'selected' : self.lookup_val == v, 'query_string' : cl.get_query_string({self.lookup_kwarg : v}), 'display' : k }# Here, we insert the new FilterSpec at the first position, to be sure# it gets picked up before any otherFilterSpec.filter_specs.insert(0, # If the field has a `profilecountry_filter` attribute set to True # the this FilterSpec will be used (lambda f: getattr(f, 'isnull_filter', False), NullFilterSpec))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)