gpt4 book ai didi

django - 如何在 Django 中为(基于类的)通用对象列表创建过滤器表单?

转载 作者:行者123 更新时间:2023-12-01 22:51:24 28 4
gpt4 key购买 nike

我正在使用 Django 1.3 的基于类的通用 View 来显示图像列表,但我想添加一个过滤器,使用户能够缩小显示结果的范围。

我目前的方法有效,但感觉很黑客:

class ImageFilterForm(ModelForm):
class Meta:
model = Image

class ImageListView(ListView):
model = Image

def get_queryset(self):
qs = Image.objects.select_related()
for item in self.request.GET:
key, value = item, self.request.GET.getlist(item)
# ... Filtering here ...
return qs

def get_context_data(self, **kwargs):
context = super(ImageListView, self).get_context_data(**kwargs)
context['filter_form'] = ImageFilterForm(self.request.GET)
return context

是否有更好的方法将自定义过滤添加到通用 View ?

最佳答案

我使用相同的方法,但通用,使用 mixin:

class FilterMixin(object):

def get_queryset_filters(self):
filters = {}
for item in self.allowed_filters:
if item in self.request.GET:
filters[self.allowed_filters[item]] = self.request.GET[item]
return filters

def get_queryset(self):
return super(FilterMixin, self).get_queryset()\
.filter(**self.get_queryset_filters())


class ImageListView(FilterMixin, ListView):

allowed_filters = {
'name': 'name',
'tag': 'tag__name',
}

# no need to override get_queryset

这允许指定接受的过滤器列表,并且它们不需要对应于实际的.filter()关键字。然后,您可以扩展它以支持更复杂的过滤(在执行 __in__range 过滤器时用逗号分隔是一个简单的示例)

关于django - 如何在 Django 中为(基于类的)通用对象列表创建过滤器表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7011773/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com