【问题标题】:Django reverse ordering with ListViewDjango 使用 ListView 进行反向排序
【发布时间】:2016-12-27 18:09:26
【问题描述】:

我已经在通用 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

在我的模板中:

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

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

希望有人能帮忙。

【问题讨论】:

    标签: python django python-3.x listview django-views


    【解决方案1】:

    您需要使用另一个变量来确定 asc/desc 顺序。根据当前选择的模板应该交替链接。在视图中,您在字段名称前通过adding a dash 反转排序。请尝试以下操作:

    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
    

    还有模板:

    <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 %}
    

    【讨论】:

    • 这是刷新页面所以如何避免刷新页面??????????????????????????/
    • 我实现了这个解决方案,但它似乎只能以一种方式工作。再次单击链接不会再次“重置”或“切换”反向参数
    猜你喜欢
    • 1970-01-01
    • 2014-09-23
    • 2015-05-26
    • 1970-01-01
    • 2021-06-14
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多