Django过滤按钮

时间:2016-12-10 22:29:04

标签: python django django-filter

我正在以非常标准的方式使用Django-filter。

class TaksFilter(django_filters.FilterSet):
    class Meta:
        model = Task
        fields = ['lastUpdated']

但我想创建自定义快速过滤按钮。像过去1天和过去7天基本上运行此查询集。

task = Task.objects.filter(lastUpdated__range=["2016-12-09", "2016-12-10"])

这可以通过django-filter完成,还是需要创建标准的POST或GET响应?

解决

感谢Ivo Donchev的帮助。使用你的代码,我解决了这个问题。当我使用函数时,我不想沿着基于类的视图的路径走下去。

form.py

class TaskFilter(django_filters.FilterSet):
last_updated = django_filters.MethodFilter()

class Meta:
    model = Task
    fields = ['lastUpdated']

def filter_last_updated(self, value, queryset):
        qs = queryset.filter(lastUpdated__gte=datetime.now()-timedelta(days=value))
        return qs    

view.py

def tasks(request):

    tasks = TaskFilter(request.GET, queryset=Task.objects.all())

    if request.method == "GET":    

        if '1' in request.GET:

            value = 1
            tasks = TaskFilter(request.GET, queryset=(TaskFilter.filter_last_updated(tasks, value, queryset=(Task.objects.all()))))

    context = {
    'tasks':tasks,
    }

return render(request, 'tasks.html', context)

我知道我可以简化视图。下一个任务。

1 个答案:

答案 0 :(得分:0)

是的,您可以使用MethodFilter使用django过滤器并实现名为filter_your_filed_name的方法,如下所示:

class TaksFilter(django_filters.FilterSet):
    last_updated = django_filters.MethodFilter()
    class Meta:
        model = Task

    def filter_last_updated(self, queryset, value):
        qs = queryset.filter(...)
        # your custom logic here using the passed value
        return qs

在模板中的标签中:     " HREF =' your-url.com LAST_UPDATED =一些值'"

在视图中:

class YourView(View):
    def get(self, *args, **kwargs):
        data = {k: v for (k, v) in self.request.GET.items()}
        qs = Task.objects.all()
        filter = TaskFilter(data, queryset=qs) # using the filter

        return super().get(*args, **kwargs)