📅  最后修改于: 2023-12-03 15:39:47.679000             🧑  作者: Mango
在 Django 中,我们可以使用 ListViews 方便地显示一组模型(Model)实例。而有时候,我们可能需要对这些模型实例进行排序,以便更方便地呈现给用户。接下来,我们将学习如何按照指定的字段对 ListViews 进行排序。
在 ListView 中,我们可以通过定义 ordering
或者 get_queryset
来排序。其中:
ordering
指定了排序的字段和排序方式,ordering = ["field1", "-field2"]
表示先按照 field1
升序排序,如果相等则按照 field2
降序排序。get_queryset
则是返回 ListView 中要显示的数据的查询集(QuerySet),可以通过重写此方法来进行排序。如果我们只需要简单地通过查询参数排序,可以使用 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
模板标签生成了三个排序链接,分别对应 id
、name
和 created_at
三个字段。当用户点击链接时,会将对应的查询参数传给视图,然后视图会根据该参数进行排序。
在本文中,我们学习了如何在 ListView 中对模型实例进行排序。通过设置 ordering
或重写 get_queryset
方法,并在模板中生成排序链接,我们可以方便地实现对数据的排序。