Django的ListView - 表单进行过滤和排序 [英] Django ListView - Form to filter and sort

查看:875
本文介绍了Django的ListView - 表单进行过滤和排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的目标


  • 一个网站,列出我所有的更新(模型) >
  • 不要一次显示所有模型(分页 - 可能每页10个)

  • 过滤和排序列表



我的想法


  • 我可以使用ListView来获取一组/ li>
  • 使用paginate_by = 10
  • 使用表单在我的QuerySet中设置order_by或过滤器


我的问题

我不确定如何添加表单来修改我的QuerySet与筛选器和分类。我的想法是通过额外的过滤器和order_by修改get_queryset中的查询。

我的视图

  class MyView(ListView):
model =更新
template_name =updates / update.html
paginate_by = 10

def get_queryset(self):
return Update.objects.filter(
〜Q(state = Update.STATE_REJECTED),
〜Q(state = Update.STATE_CANCELED),
〜Q(state = Update.STATE_FINISHED),
).order_by(
'planned_release_date'

我的想法



类似这样的。我知道这不是像这样工作...只是为了说明
$ b $ pre $ class $ MyView(ListView)
model =
template_name =updates / update.html
paginate_by = 10
$ b $ def post(self,request,* args,** kwargs):
new_context = .objects.filter(
request.POST.get(filter),
).order_by(
request.POST.get(sorting),

$ b $ def get_queryset(self):
return Update.objects.filter(
〜Q(state = Update.STATE_REJECTED),
〜Q(state = Update.STATE_CANCELED) ,
〜Q(state = Update.STATE_FINISHED),
).order_by(
'planned_release_date'


解决方案

您不需要发布。传递过滤器的值和order_by在url中,例如:
$ b $ p $ update $ list / filter = filter-val& orderby = order-val



并获取get_queryset中的过滤器和orderby:

 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.G ET.get('orderby','give-default-value')
返回上下文

确保你给出正确的默认值来过滤和排序

示例表单(可以根据需要进行修改):

 < form method =getaction ={%url'update-list'%}> 
< p>过滤器:< input type =textvalue = {{filter}} name =filter/>< / p>
< p> order_by:< input type =textvalue = {{orderby}} name =orderby/>< / p>
< p>< input type =submitname =submitvalue =submit/>< / p>
< / form>


My Goal

  • A site that list all my Updates (model) in a table
  • Dont display all models at once (pagination - maybe 10 per page)
  • Filter and sort the list

My thoughts

  • I can use ListView to get a set of all my Updates
  • Use paginate_by = 10
  • Use a form to set order_by or filter in my QuerySet

My Problem

I am not sure how to add an form to modify my QuerySet with filter and sortings. My Idea was to modify the Query in get_queryset with additional filter and order_by.

My View

class MyView(ListView):
    model = Update
    template_name = "updates/update.html"
    paginate_by = 10

    def get_queryset(self):
        return Update.objects.filter(
            ~Q(state=Update.STATE_REJECTED),
            ~Q(state=Update.STATE_CANCELED),
            ~Q(state=Update.STATE_FINISHED),
        ).order_by(
            'planned_release_date'
        )

My Idea

Something like this. I know it's not working like this ... just to illustrate

class MyView(ListView):
    model = Update
    template_name = "updates/update.html"
    paginate_by = 10

    def post(self, request, *args, **kwargs):
        new_context = Update.objects.filter(
            request.POST.get("filter"),
        ).order_by(
            request.POST.get("sorting"),
        )

    def get_queryset(self):
        return Update.objects.filter(
            ~Q(state=Update.STATE_REJECTED),
            ~Q(state=Update.STATE_CANCELED),
            ~Q(state=Update.STATE_FINISHED),
        ).order_by(
            'planned_release_date'
        )

解决方案

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):

<form method="get" action="{% url 'update-list' %}">
    <p>Filter: <input type="text" value={{filter}} name="filter"/></p>
    <p>order_by: <input type="text" value={{orderby}} name="orderby"/></p>
    <p><input type="submit" name="submit" value="submit"/></p>
</form>

这篇关于Django的ListView - 表单进行过滤和排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆