如何在带有过滤器的 Django 中按价格从低到高和从高到低对产品进行排序

how to sort product by price low to high and high to low in django with fillters

我想按照从低到高和从高到低的价格对产品列表进行排序并在模板中呈现

我的models.py

class Item(models.Model):

    categories = models.ForeignKey(Categories, on_delete=models.CASCADE, related_name='our_items')
    subcategories = models.ForeignKey(Subcategories, on_delete=models.CASCADE, related_name='products')
    can_buy = models.ForeignKey(For, on_delete=models.CASCADE, related_name='for_wearing')
    name = models.CharField(max_length=200, blank=False)
    contain_size = models.CharField(max_length=50, blank=True)
    brand_name = models.CharField(max_length=100, blank=False, default='Bagh')
    first = models.ImageField(upload_to='items', blank=False)
    second = models.ImageField(upload_to='items', blank=False)
    third = models.ImageField(upload_to='items', blank=True)
    fourth = models.ImageField(upload_to='items', blank=True)
    fifth = models.ImageField(upload_to='items', blank=True)
    rating = models.FloatField(blank=False,default='4.0')
    item_video = models.FileField(upload_to='item_vedio', blank=True)
    color = models.CharField(max_length=30, blank=False, default='Black')
    material = models.CharField(max_length=50, blank=False, default='Plastic' )
    return_policy = models.CharField(max_length=100, blank=False, default='7Days Return Policy')
    stock = models.CharField(max_length=50, blank=False, default='In Stock')
    price = models.FloatField(blank=False,)
    actual_price = models.FloatField(blank=False)
    type = models.CharField(blank=False, max_length=100, default='washable')
    about = models.CharField(blank=False,max_length=100, default='Lusturous')
    offer = models.CharField(max_length=4, blank=True)
    joined_date = models.DateTimeField(default=timezone.now,editable=False)
    update_at = models.DateTimeField(auto_now=True)
    description = models.TextField(blank=True)
    
    def __str__(self):
        return self.name


class Subcategories(models.Model):
    categories = models.ForeignKey(Categories, on_delete=models.CASCADE, related_name='our_categories')
    name = models.CharField(max_length=200, blank=False)
    joined_date = models.DateTimeField(default=timezone.now,editable=False)
    update_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

这是我的 views.py

class Product(View):
    def get(self, request, subcategory_id):
        subcategory = get_object_or_404(Subcategories, pk=subcategory_id)
        products = subcategory.products.all()
        category_list = Categories.objects.all()
        print(products)
        return render (request, 'products.html',{"subcategory_list" : products, 'category_list': category_list })

我的html

<div class="col-10">
            <ul>
              <li class="filters"><strong>Sort By :</strong></li>
              <li class="filters"><a class="filter_by" href="">Popularity</a></li>
              <li class="filters"><a class="filter_by" href="">Price:--low to high</a></li>
              <li class="filters"><a class="filter_by" href="">Price:-- high to low</a></li>
              <li class="filters"><a class="filter_by" href="">Newest First</a></li>
              <li class="filters"><a class="filter_by" href="">Discount</a></li>
            </ul>
        </div>
        <section class="col-10">
          {% for products in subcategory_list %}
          <a class="products" href="{% url 'products:detail' item_id=products.id %}">
          <div class="card col-4" style="width: 18rem; height:420px">
              <img class="img" src="{{ products.first.url }}" alt="" height="300px" width="100%" onmouseover="this.src='{{ products.second.url }}'"
              onmouseout="this.src='{{ products.first.url }}'" >
              <div class="detail">
              <h4 class="price">{{ products.price|currency}}</h4>
              <h5>{{products.name}} <br> <span class="brand">{{ products.brand_name}}</span> <span class="btn btn-success buton">✔Authentic</span> </h5>
              <p class="rate">Rate: {{products.rating}}<i class="fas fa-star"></i></p>
              <h6>Size:<span> {{products.contain_size}}</span> </h6>
              </div>
            </div>
          </a>
            {% endfor %} 
          </div>  
        </section>

如您所见,我创建了一个 div 并在其中进行了排序,因此当用户单击该 link 时我想要的结果会按该顺序呈现产品列表,但我有不知道如何做到这一点,我看到了一些文件,但这似乎不是实现该目标的最佳方法任何想法都是实现该目标的最佳方法 谢谢你的时间

在你的html

<li class="filters"><a class="filter_by" href="?sort=l2h">Price:--low to high</a></li>
<li class="filters"><a class="filter_by" href="?sort=h2l">Price:-- high to low</a></li>

在您看来

def get(self, request, subcategory_id):
        subcategory = get_object_or_404(Subcategories, pk=subcategory_id)

        sort_by = request.GET.get("sort", "l2h") 
        if sort_by == "l2h":
           products = subcategory.products.order_by("price")
        elif sort_by == "h2l":
           products = subcategory.products.order_by("-price")

        category_list = Categories.objects.all()
        return render (request, 'products.html',{"subcategory_list" : products, 'category_list': category_list })

解释:

当您从前端点击排序 link 时,只需在浏览器中查看您的 url。 我们正在发送一个 sort 参数,告诉我们应该如何排序。

我们在视图中检索该参数

sort_by = request.GET.get("sort", "l2h") 

注意:这里如果没有提供参数(当用户访问该页面时)它将按 l2h 又名 low to high

排序

您可以相应地更改它,您想要什么默认值sorting/filtering

最后,我们只是使用 django 查询来过滤我们的数据。

并在您的模板中使用它