2016-12-10 23 views
0

我以非常标准的方式使用Django筛选器。Django筛选器按钮

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的过滤器或我需要创建一个标准的POST或GET响应?

解决

感谢伊沃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) 

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

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 

在模板标签:

回答

0

是的,你可以使用MethodFilter和实现方法命名filter_your_filed_name像这样的Django过滤器做呢? 的“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) 
+0

谢谢,我添加了一点,但我会如何将其链接到一个按钮模板链接回该过滤器阙你定了吗? – Spinnaay

+0

那么你可以使用链接它作为获取参数: –

+0

我刚刚编辑帖子 –