2016-12-10 25 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

我剛剛編輯帖子 –