我使用基于类的通用视图Listview
列出所有对象。
我的views.py:
class PostsList(ListView):
model = Post
template_name = "index.html"
我的Urls.py:
urlpatterns = [
url(r'^$',PostsList.as_view(), name = "home"),
]
这给了我所有帖子的列表。现在,我想基于Post
模型的某些字段过滤/排序帖子,比如price
。我需要自己写这个吗?如果是,我覆盖了PostsLists
类的哪种方法? def get
,def get_context
?
我看到Listview的get方法定义如下。在其中,我可以直接将URL查询参数作为**kwargs
传递,或者我必须在我的类中覆盖以下方法。
def get(self, request, *args, **kwargs):
....
答案 0 :(得分: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
答案 1 :(得分:5)
使用Django基于类的视图时,如果可能,请避免覆盖get()
或post()
。这些方法做了很多,如果你覆盖它们,你可能不得不复制很多内置功能。通常可以覆盖更具体的方法。
在您的情况下,您可以使用get_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
如果您的网址捕获了参数,则可以使用self.args
(位置)和self.kwargs
(基于名称)访问它们。
有关详细信息,请参阅dynamic filtering上的文档。