Python 使用查询参数在基于类的视图Django中过滤对象?

Python 使用查询参数在基于类的视图Django中过滤对象?,python,django,Python,Django,我使用基于类的通用视图Listview列出所有对象 My views.py: class PostsList(ListView): model = Post template_name = "index.html" My URL.py: urlpatterns = [ url(r'^$',PostsList.as_view(), name = "home"), ] 这给了我一个所有帖子的列表。现在我想根据Post模型的某些字段,比如price对帖子进行过滤/排序。我

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

My views.py:

class PostsList(ListView):
    model = Post
    template_name = "index.html"
My URL.py:

urlpatterns = [
    url(r'^$',PostsList.as_view(), name = "home"),
] 
这给了我一个所有帖子的列表。现在我想根据
Post
模型的某些字段,比如
price
对帖子进行过滤/排序。我需要自己写这个吗?如果是,我应该覆盖
postsList
类的哪个方法<代码>定义获取,
定义获取上下文

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

def get(self, request, *args, **kwargs):
    ....

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

在您的情况下,您可以使用
get\u queryset
方法动态过滤查询集。您可以使用
self.request.GET
访问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
如果url捕获参数,则可以使用
self.args
(位置)和
self.kwargs
(基于名称)访问它们


有关更多信息,请参阅上的文档。

您可以覆盖get\u 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

另外:您可以使用
self.args
self.kwargs
从URL访问args和kwargs。出现了一些错误:
get\u queryset()只接受2个参数(给定1个)
首先它表示未定义
request
对象。所以我把它作为一个参数放在
def get_queryset(self,request)
中,然后出现了一个新的错误:
get_queryset()正好接受2个参数(给定1个)
而且我正在记录
logger.debug(self.kwargs),logger.debug(self.args)
和在url im中传递查询参数,如
?title=1984
,它们在日志中为空。它应该是
self.request
,而不是
request
。我已经修复了上面的代码。您应该从
def get\u request(self)
中删除
request
。它只需要一个参数。您可以在此处查看get_queryset的原始代码。是的,你是对的。我添加了一个请求参数,后来删除了它。现在它开始工作了。我如何在后端访问url查询参数
self.request.GET.GET
是一种方法。我是否可以使用
self.args
self.kwargs
取决于您的url方案。假设您的url类似于:
posts/
,您可以访问
get\u queryset
中的post\u值,如
self.kwargs.get('post\u值')
。因此,您可以像
queryset=queryset.filter(price=self.kwargs.get('price\u value'))一样过滤查询集。