简体   繁体   中英

Filtering Objects in Class based view Django using Query parameters?

I am using Class-based Generic views Listview for listing all objects.

My views.py:

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

My Urls.py:

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

This gives me a list of all the posts. Now I want to filter/sort posts based on certain fields of Post Model, say price . Do I need to write this myself? If yes Which method of PostsLists class do I override ? def get , def get_context ?

I see the get method for Listview defined as below. In it can I pass URL query-parameters as **kwargs directly or I have to overwrite the below method in my class.

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

You can override the get_queryset method:

Keep a mapping of all the parameters that you can get in the 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

When using Django's class based views, avoid overriding get() or post() if possible. These methods do a lot, and if you override them, you may have to duplicate a lot of the built in functionality. There are normally more specific methods that you can override.

In your case, you can filter the queryset dynamically with the get_queryset method. You can access GET parameters with self.request.GET . For example:

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

If your url captures arguments, you can access them with self.args (positional) and self.kwargs (name based).

See the docs on dynamic filtering for more info.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM