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

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

问题描述

我的目标

  • 一个在表格中列出我所有更新(模型)的网站
  • 不要一次显示所有模型(分页 - 每页可能 10 个)
  • 过滤和排序列表

我的想法

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

我的问题

我不知道如何添加一个表单来使用过滤器和排序来修改我的 QuerySet.我的想法是使用额外的过滤器和 order_by 修改 get_queryset 中的查询.

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.

我的观点

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

我的想法

类似的东西.我知道它不是这样工作的......只是为了说明

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

推荐答案

你不需要发帖.在 url 中传递过滤器值和 order_by 例如:

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

并在 get_queryset 中获取过滤器和 orderby,例如:

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天全站免登陆