我正在以非常标准的方式使用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)
我知道我可以简化视图。下一个任务。
答案 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)