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

2024-04-29 12:10:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的观点.py:

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

我的url.py:

urlpatterns = [
    url(r'^$',PostsList.as_view(), name = "home"),
] 

这给了我一个所有帖子的列表。现在我想根据Post模型的某些字段(比如price)筛选/排序文章。我需要自己写吗?如果是,我要重写PostsLists类的哪个方法?def getdef get_context

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

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

Tags: 对象方法namepy视图urlgetdef
2条回答

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

在您的例子中,可以使用get_queryset方法动态过滤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(基于名称)访问它们。

有关详细信息,请参阅dynamic filtering上的文档。

您可以重写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

相关问题 更多 >