如何在django中使用过滤器按价格从低到高、从高到低排序产品



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

我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

这是我的观点。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,我在里面放了排序,所以我想当用户点击那个链接时,它会按照那个顺序呈现产品列表,但我不知道怎么做,我看到了一些文档,但这似乎不是最好的实现方式任何想法,这是最好的实现方式谢谢你的宝贵时间

在你的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 })

解释:

当你点击排序链接从前端,只是看看你在浏览器中的url。我们正在发送一个sort参数,它告诉我们应该如何排序。

我们在视图中检索这个参数

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

注意:这里如果没有提供参数(当用户访问该页面时),它将按l2hlow to high排序

你可以相应地改变,你想要什么样的默认排序/过滤

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

在你的模板中使用

最新更新