Django 使用 ListView 进行反向排序

Wes*_*ssi 2 python django listview django-views python-3.x

我已经在通用 ListView 中实现了排序:

class CarList(LoginRequiredMixin, ListView):
    model = Car
    paginate_by = 30

    ordering = 'car_id_internal'

    def get_ordering(self):
        return self.request.GET.get('ordering', 'car_id_internal')

    def get_context_data(self, *args, **kwargs):
        context = super(CarList, self).get_context_data(*args, **kwargs)
        context['current_order'] = self.get_ordering()
        return context
Run Code Online (Sandbox Code Playgroud)

在我的模板中:

<thead>
    <tr>
        <th><a href="{% url 'car_list' %}?ordering=car_id_internal">Internal car ID</a></th>
        <th><a href="{% url 'car_list' %}?ordering=type">Type</a></th>
        <th><a href="{% url 'car_list' %}?ordering=brand">Brand</a></th>
    </tr>
</thead>
Run Code Online (Sandbox Code Playgroud)

这工作正常,但是我希望用户能够在再次单击列标题时将顺序从升序反转为降序。这可能与 Django 吗?我正在使用 Django 1.9。

我希望有人能帮帮忙。

NS0*_*NS0 5

您需要使用另一个变量来确定升序/降序排序。根据当前选择的模板应该交替链接。在视图中,您可以通过在字段名称前添加破折号来颠倒顺序。请尝试以下操作:

class CarList(ListView):
    model = Car
    paginate_by = 30

    ordering = 'car_id_internal'
    def get_ordering(self):
        self.order = self.request.GET.get('order', 'asc')
        selected_ordering = self.request.GET.get('ordering', 'car_id_internal')
        if self.order == "desc":
            selected_ordering = "-" + selected_ordering
        return selected_ordering

    def get_context_data(self, *args, **kwargs):
        context = super(CarList, self).get_context_data(*args, **kwargs)
        context['current_order'] = self.get_ordering()
        context['order'] = self.order
        return context
Run Code Online (Sandbox Code Playgroud)

和模板:

<table>
<tr>
    <th><a href="{% url 'car_list' %}?ordering=car_id_internal&order={% if order == 'desc' %}asc{% else %}desc{% endif %}">Internal car ID</a></th>
    <th><a href="{% url 'car_list' %}?ordering=type&order={% if order == 'desc' %}asc{% else %}desc{% endif %}">Type</a></th>
    <th><a href="{% url 'car_list' %}?ordering=brand&order={% if order == 'desc' %}asc{% else %}desc{% endif %}">Brand</a></th>
</tr>
{% for car in object_list %}
<tr>
    <td>{{car.id}}</td>
    <td>{{car.type}}</td>
    <td>{{car.brand}}</td>
</tr>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)