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'))一样过滤查询集。