2013-05-25 29 views
1

自定義過濾器我已經在我的admin.py文件以下過濾器:測試在admin.py

class parentCategoryFilter(admin.SimpleListFilter): 
    title = 'parent category' 
    parameter_name = 'parent_category' 

    def lookups(self, request, model_admin): 
     first_level_categories = model_admin.get_queryset(request).filter(parent_category__isnull=True) 

     if first_level_categories: 

      lookups = (('none', 'None'),) 

      for first_level_category in first_level_categories: 
       lookups += ((first_level_category.id, first_level_category.name),) 

      return lookups 

    def queryset(self, request, queryset): 
     if self.value() == 'none': 
      return queryset.filter(parent_category__isnull=True) 
     elif self.value(): 
      try: 
       return queryset.filter(parent_category=int(self.value())) 
      except (ValueError, TypeError): 
       return queryset.none() 
     else: 
      pass 

而且我想在我的tests.py文件來測試它,但是在試圖將類實例啓動要求我約5 __init__參數。有沒有可能測試這個過濾器功能?

回答

2

5個參數__init__需求爲admin.SimpleListFilter,其__init__定義爲:(Source

def __init__(self, request, params, model, model_admin): 

您可以在這些參數傳遞到測試過濾

+1

謝謝,我會後的解決方案,因此其他可以看到它。 – Ben

5

感謝karthikr和大量的閱讀我想出了以下解決方案(使用Django的Pool示例):

過濾方法定義如下:

class WasPublishedRecentlyFilter(admin.SimpleListFilter): 
    title = 'Was published recently' 
    parameter_name = 'published_recently' 

    def lookups(self, request, model_admin): 
     return (
      ('yes', 'Yes',), 
      ('no', 'No',), 
     ) 

    def queryset(self, request, queryset): 
     if self.value() == 'yes': 
      #filter logic 
     elif self.value() == 'no': 
      #filter logic 
     elif self.value(): 
      return queryset.none() 

而且測試過濾器:

def test_filter(self): 
    Poll.objects.create(question='Sup?', pub_date=timezone.now()) 
    Poll.objects.create(question='How you doing?', pub_date=timezone.now() - datetime.timedelta(days=1)) 

    filter = admin.WasPublishedRecentlyFilter(None, {'published_recently':'yes'}, Poll, admin.PollAdmin) 
    poll = filter.queryset(None, Poll.objects.all())[0] 
    self.assertEqual(poll.question, 'Sup?') 

    filter = admin.WasPublishedRecentlyFilter(None, {'published_recently':'no'}, Poll, admin.PollAdmin) 
    poll = filter.queryset(None, Poll.objects.all())[0] 
    self.assertEqual(poll.question, 'How you doing?') 

和輸出:

Creating test database for alias 'default'... 
. 
---------------------------------------------------------------------- 
Ran 1 test in 0.124s 

OK 
Destroying test database for alias 'default'...