2016-06-13 949 views
4

在models.py我:Django管理list_filter - 通过过滤器字段为空(无或空字符串 “”)

class User(modals.Model): 
    name = models.CharField(max_length=255) 
    image = models.ImageField(blank=True, null=True) 

而且在admin.py:

class UserAdmin(admin.ModelAdmin): 
    list_filter = ['image'] 

admin.site.register(User, UserAdmin) 

我只是想过滤用户通过具有图像或不(null或空字符串)

但是django的示出了由图像网址=滤波器)

是否有WA Ÿ使list_filter = ['图像']行为像布尔字段?

大thx的意见!

回答

6

admin.py

class ImageListFilter(admin.SimpleListFilter): 

    title = _('Has photo') 

    parameter_name = 'has_photo' 

    def lookups(self, request, model_admin): 

     return (
      ('yes', _('Yes')), 
      ('no', _('No')), 
     ) 

    def queryset(self, request, queryset): 

     if self.value() == 'yes': 
      return queryset.filter(image__isnull=False).exclude(image='') 

     if self.value() == 'no': 
      return queryset.filter(Q(image__isnull=True) | Q(image__exact='')) 


class UserAdmin(admin.ModelAdmin): 

    list_filter = [ImageListFilter] 
+0

这也适用于外键反向查找。 – Babu

2

基于MaxCore的回答,我创建定制类,我可以用它来修改名称和参数名:

class NotNullFilter(admin.SimpleListFilter): 
    title = _('Filter title not set') 

    parameter_name = 'parameter name not set' 

    def lookups(self, request, model_admin): 

     return (
      ('not_null', _('Not empty only')), 
      ('null', _('Empty only')), 
     ) 

    def queryset(self, request, queryset): 

     if self.value() == 'not_null': 
      is_null_false = { 
       self.parameter_name + "__isnull": False 
      } 
      exclude = { 
       self.parameter_name: "" 
      } 
      return queryset.filter(**is_null_false).exclude(**exclude) 

     if self.value() == 'null': 
      is_null_true = { 
       self.parameter_name + "__isnull": True 
      } 
      param_exact = { 
       self.parameter_name + "__exact": "" 
      } 
      return queryset.filter(Q(**is_null_true) | Q(**param_exact)) 


class YoutubeNotNullFilter(NotNullFilter): 
    title = "Youtube" 
    parameter_name = "youtube_videoid" 
0

基类的KH的做法,可以很容易地重用对我来说真的很有帮助。我无法获得书面示例,但只需稍作调整即可完成此工作(Python 2.7,Django 1.10)。

from django.contrib import admin 


class NotNullFilter(admin.SimpleListFilter): 
    title = _('Filter title not set') 
    parameter_name = 'parameter name not set' 

    def lookups(self, request, model_admin): 
     return (
      ('not_null', _('Not empty only')), 
      ('null', _('Empty only')), 
     ) 

    def queryset(self, request, queryset): 
     filter_string = self.parameter_name + '__isnull' 
     if self.value() == 'not_null': 
      is_null_false = { 
       filter_string: False 
      } 
      return queryset.filter(**is_null_false) 

     if self.value() == 'null': 
      is_null_true = { 
       filter_string: True 
      } 
      return queryset.filter(**is_null_true)enter code here 


class YoutubeNotNullFilter(NotNullFilter): 
    title = "Youtube" 
    parameter_name = "youtube_videoid" 


class SomeVideoClass(admin.ModelAdmin): 
    ... 
    list_filter = [YouTubeNotNullFilter, ...]