📜  按 listview django 排序 - Python (1)

📅  最后修改于: 2023-12-03 15:39:47.679000             🧑  作者: Mango

按 listview django 排序

在 Django 中,我们可以使用 ListViews 方便地显示一组模型(Model)实例。而有时候,我们可能需要对这些模型实例进行排序,以便更方便地呈现给用户。接下来,我们将学习如何按照指定的字段对 ListViews 进行排序。

基本思路

在 ListView 中,我们可以通过定义 ordering 或者 get_queryset 来排序。其中:

  • ordering 指定了排序的字段和排序方式,ordering = ["field1", "-field2"] 表示先按照 field1 升序排序,如果相等则按照 field2 降序排序。
  • get_queryset 则是返回 ListView 中要显示的数据的查询集(QuerySet),可以通过重写此方法来进行排序。
在 ListView 中使用 ordering

如果我们只需要简单地通过查询参数排序,可以使用 ListView 中的 ordering 属性。具体来说:

class MyListView(ListView):
    model = MyModel
    template_name = "my_template.html"
    ordering = ["-created_at"]  # 按照 created_at 字段降序排序

上述代码中,我们将 ListView 的 ordering 属性设置为 ["-created_at"],表示按照 created_at 字段降序排序。

如果我们需要根据查询参数进行排序,可以在视图类中重写 get_queryset 方法:

class MyListView(ListView):
    model = MyModel
    template_name = "my_template.html"
    ordering = ["-created_at"]  # 按照 created_at 字段降序排序

    def get_queryset(self):
        qs = super().get_queryset()
        order_by = self.request.GET.get("order_by")
        if order_by:
            qs = qs.order_by(order_by)
        return qs

上述代码中,我们在 get_queryset 方法中获取了查询参数 order_by,如果存在则按照该字段进行排序,否则按照 ordering 值进行排序。

在模板中生成排序链接

最后一步是在模板中生成排序链接,以便用户可以通过点击链接来进行排序。在 ListView 中,我们可以使用 url 模板标签生成排序链接。具体来说:

<table>
    <thead>
        <tr>
            <th>{% url "my_view" %}?order_by=id</th>
            <th>{% url "my_view" %}?order_by=name</th>
            <th>{% url "my_view" %}?order_by=created_at</th>
            <!-- ... -->
        </tr>
    </thead>
    <tbody>
        {% for instance in object_list %}
        <tr>
            <td>{{ instance.id }}</td>
            <td>{{ instance.name }}</td>
            <td>{{ instance.created_at }}</td>
            <!-- ... -->
        </tr>
        {% endfor %}
    </tbody>
</table>

上述代码中,我们使用 url 模板标签生成了三个排序链接,分别对应 idnamecreated_at 三个字段。当用户点击链接时,会将对应的查询参数传给视图,然后视图会根据该参数进行排序。

总结

在本文中,我们学习了如何在 ListView 中对模型实例进行排序。通过设置 ordering 或重写 get_queryset 方法,并在模板中生成排序链接,我们可以方便地实现对数据的排序。