在admin.py中测试自定义过滤器

Ben*_*Ben 4 django django-admin django-tests

我的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
Run Code Online (Sandbox Code Playgroud)

我想在我的tests.py文件中测试它,但是在尝试实例化类时,它开始向我询问大约5个__init__参数.是否可以测试此过滤器功能?

Ben*_*Ben 11

感谢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() 
Run Code Online (Sandbox Code Playgroud)

并且过滤器的测试:

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?')
Run Code Online (Sandbox Code Playgroud)

并输出:

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

OK
Destroying test database for alias 'default'...
Run Code Online (Sandbox Code Playgroud)

  • 这个答案似乎有点过时,但是如果您正在检查这个并且您使用的是 Django 2.0,[这里是 Django 测试 SimpleListFilter 的方式](https://github.com/django/django/blob/master/tests/admin_filters/测试.py#L820) (2认同)

kar*_*ikr 6

__init__需要的5个参数来自admin.SimpleListFilter其__init__定义为:(来源)

def __init__(self, request, params, model, model_admin):
Run Code Online (Sandbox Code Playgroud)

您可以传入这些参数来测试您的过滤器