2016-06-13 948 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, ...]