Кнопки фильтра Джанго

Я использую 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-filter или мне нужно создать стандартный ответ POST или GET?

Решено

Спасибо Иво Дончеву за помощь. Используя ваш код, я решил это так. Я не хотел идти по пути представлений на основе классов, поскольку я использую функции.

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)

Я знаю, что могу немного упростить вид. Следующая задача.


person Spinnaay    schedule 10.12.2016    source источник


Ответы (1)


Да, вы можете сделать это с помощью фильтров django, используя MethodFilter и реализуя метод с именем 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=some-value'"

И в представлении:

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)
person Ivo Donchev    schedule 10.12.2016
comment
Спасибо, я добавил этот бит, но как мне связать его с кнопкой в ​​шаблоне, чтобы вернуться к этому набору запросов фильтра? - person Spinnaay; 11.12.2016
comment
Ну, вы можете использовать ссылку как параметр получения: - person Ivo Donchev; 12.12.2016
comment
обратите внимание, что MethodFilter устарел в пользу аргумента method (документы). - person Sherpa; 18.12.2016