You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中实现用户自定义商品排序功能?

实现商品自定义排序功能

1. 视图层处理排序逻辑

在商品列表视图中,通过请求参数获取用户选择的排序方式,动态调整查询集的排序规则。

函数视图示例

from django.shortcuts import render
from .models import Product

def product_list(request):
    # 获取排序参数,默认按新品排序(最新创建的商品在前)
    sort_by = request.GET.get('sort', 'newest')
    
    # 根据参数筛选并排序商品
    base_query = Product.objects.filter(is_published=True, available=True)
    if sort_by == 'price_asc':
        products = base_query.order_by('price')
    elif sort_by == 'price_desc':
        products = base_query.order_by('-price')
    elif sort_by == 'newest':
        products = base_query.order_by('-time_create')
    else:
        # 默认 fallback 到新品排序
        products = base_query.order_by('-time_create')
    
    context = {
        'products': products,
        'current_sort': sort_by
    }
    return render(request, 'product_list.html', context)

类视图(ListView)示例

from django.views.generic import ListView
from .models import Product

class ProductListView(ListView):
    model = Product
    template_name = 'product_list.html'
    context_object_name = 'products'
    
    def get_queryset(self):
        sort_by = self.request.GET.get('sort', 'newest')
        queryset = super().get_queryset().filter(is_published=True, available=True)
        
        if sort_by == 'price_asc':
            return queryset.order_by('price')
        elif sort_by == 'price_desc':
            return queryset.order_by('-price')
        elif sort_by == 'newest':
            return queryset.order_by('-time_create')
        return queryset.order_by('-time_create')
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['current_sort'] = self.request.GET.get('sort', 'newest')
        return context

2. 模板层添加排序按钮

在商品列表模板(product_list.html)中添加排序选择按钮,通过GET请求传递排序参数,同时标记当前选中的排序方式:

<div class="sort-controls">
    <h3>排序方式</h3>
    <a href="?sort=newest" class="{% if current_sort == 'newest' %}active{% endif %}">新品优先</a>
    <a href="?sort=price_asc" class="{% if current_sort == 'price_asc' %}active{% endif %}">价格从低到高</a>
    <a href="?sort=price_desc" class="{% if current_sort == 'price_desc' %}active{% endif %}">价格从高到低</a>
</div>

<!-- 商品列表展示 -->
<div class="products-grid">
    {% for product in products %}
        <div class="product-item">
            <h4>{{ product.title }}</h4>
            <p>价格: {{ product.price }}</p>
            <p>上架时间: {{ product.time_create|date:"Y-m-d" }}</p>
            <!-- 其他商品信息渲染 -->
        </div>
    {% endfor %}
</div>

给活跃状态的按钮添加CSS样式,提升用户体验:

.sort-controls a {
    margin-right: 10px;
    padding: 5px 10px;
    text-decoration: none;
    border: 1px solid #ccc;
    border-radius: 4px;
}

.sort-controls a.active {
    background-color: #007bff;
    color: white;
    border-color: #007bff;
}

3. 可选:兼容分页功能

如果商品列表启用了分页,需要在分页链接中保留当前排序参数,避免切换分页时排序规则重置:

<div class="pagination">
    {% if page_obj.has_previous %}
        <a href="?page={{ page_obj.previous_page_number }}&sort={{ current_sort }}">上一页</a>
    {% endif %}
    <span>第 {{ page_obj.number }} 页 / 共 {{ page_obj.paginator.num_pages }} 页</span>
    {% if page_obj.has_next %}
        <a href="?page={{ page_obj.next_page_number }}&sort={{ current_sort }}">下一页</a>
    {% endif %}
</div>

内容的提问来源于stack exchange,提问作者Lightcart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:05:22