Django ListView - Form to filter and sort

前端 未结 4 937
醉梦人生
醉梦人生 2020-12-12 22:58

My Goal

  • A site that list all my Updates (model) in a table
  • Dont display all models at once (pagination - maybe 10 per page)
4条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-12 23:39

    You don't need post. Pass the filter value and order_by in the url for example:

    .../update/list/?filter=filter-val&orderby=order-val

    and get the filter and orderby in the get_queryset like:

    class MyView(ListView):
        model = Update
        template_name = "updates/update.html"
        paginate_by = 10
    
        def get_queryset(self):
            filter_val = self.request.GET.get('filter', 'give-default-value')
            order = self.request.GET.get('orderby', 'give-default-value')
            new_context = Update.objects.filter(
                state=filter_val,
            ).order_by(order)
            return new_context
    
        def get_context_data(self, **kwargs):
            context = super(MyView, self).get_context_data(**kwargs)
            context['filter'] = self.request.GET.get('filter', 'give-default-value')
            context['orderby'] = self.request.GET.get('orderby', 'give-default-value')
            return context
    

    Make sure you give proper default value to filter and orderby

    Example form (you can modify this to your need):

    Filter:

    order_by:

提交回复
热议问题