使用Query参数过滤基于类的视图Django中的对象?

Cod*_*mon 3 python django

我正在使用基于类的通用视图Listview来列出所有对象.

我的views.py:

class PostsList(ListView):
    model = Post
    template_name = "index.html"
Run Code Online (Sandbox Code Playgroud)

我的Urls.py:

urlpatterns = [
    url(r'^$',PostsList.as_view(), name = "home"),
] 
Run Code Online (Sandbox Code Playgroud)

这给了我所有帖子的清单.现在我想基于Model的某些字段来过滤/排序帖子Post,比方说price.我需要自己写这个吗?如果是,PostsLists我覆盖哪种类的方法?def get,def get_context

我看到Listview的get方法定义如下.在其中我可以**kwargs直接传递URL查询参数,或者我必须在我的类中覆盖以下方法.

def get(self, request, *args, **kwargs):
    ....
Run Code Online (Sandbox Code Playgroud)

Ani*_*rma 7

您可以覆盖get_queryset方法:

保留url kwargs中可以获得的所有参数的映射.

def get_queryset(self):
    queryset = Post.objects.all()

    if self.request.GET.get('price'):
        queryset = queryset.filter(price=self.request.GET.get('price'))
    return queryset
Run Code Online (Sandbox Code Playgroud)


Ala*_*air 5

使用Django基于类的视图时,请避免覆盖get()post()尽可能使用.这些方法做了很多,如果你覆盖它们,你可能需要复制很多内置功能.通常可以覆盖更具体的方法.

在您的情况下,您可以使用该get_queryset方法动态过滤查询集.您可以使用访问GET参数self.request.GET.例如:

class PostsList(ListView):
    model = Post

    def get_queryset(self):
        """Filter by price if it is provided in GET parameters"""
        queryset = super(PostsList, self).get_queryset()
        if 'price' in self.request.GET:
            queryset = queryset.filter(price=self.request.GET['price'])
        return queryset
Run Code Online (Sandbox Code Playgroud)

如果您的url捕获参数,则可以使用self.args(位置)和self.kwargs(基于名称)访问它们.

有关详细信息,请参阅有关动态过滤的文档.