问题描述
在我的项目中,我正在使用 django-filter,当我将 .qs 添加到 {% for product in products %}
{% for product in products.qs %}
时。在模板结果过滤器显示,但产品不是。这是我的文件。
html
<form method="get">
{{ filtera.form.as_p }}
{{ filterB.form.as_p }}
<input type="submit" value="Press" class="filter-go">
</form>
{% for product in products.qs %}
<div class="product" onclick="location.href='{% url 'items' product.id %}'">
<img src="{{product.image.url}}" alt="Img is not found (">
<p class="product-title">{{ product.title }}</p>
<b><p class="product-price">{{ product.price }} ₽</p></b>
</div>
{% endfor %}
views.py
def index(request):
con = {
'services': Service.objects.all(),'products': Product.objects.all(),'galery': galeryImage.objects.all(),'product_types': Category.objects.all(),'filtera': Filtera(request.GET,queryset=Product.objects.all()),'filterB': FilterB(request.GET,}
return render(request,'index.html',con)
def product(request,pk=None):
try:
a = Product.objects.get(id=pk)
except:
return render(request,'error404.html')
context = {
'id': pk,'product': a,'product.html',context)
filters.py
class Filtera(django_filters.FilterSet):
class Meta:
model = Product
fields = ['category']
class FilterB(django_filters.FilterSet):
CHOICES = (
('ascending','По дате (А-Я)'),('descending','По дате (Я-А)'),)
CHOICES2 = (
('price_low','По цене по возрастанию'),('price_high','По цене по убыванию'),)
orderDate = django_filters.ChoiceFilter(choices=CHOICES,method='filter_by_date',label='')
orderPrice = django_filters.ChoiceFilter(choices=CHOICES2,method='filter_by_price',label='')
class Meta:
model = Product
fields = {
'price': ['lt','gt'],}
def filter_by_date(self,queryset,name,value):
expr = 'date' if value == 'ascending' else '-date'
return queryset.order_by(expr)
def filter_by_price(self,value):
expr = 'price' if value == 'price_low' else '-price'
return queryset.order_by(expr)
models.py
class Product(models.Model):
category = models.ForeignKey(Category,verbose_name='Կատեգորիա',on_delete=models.CASCADE)
title = models.CharField(max_length=225,verbose_name='Ապրանքի վեռնագիրը')
description = models.TextField(verbose_name='Նկարագրություն',null=True)
image = models.ImageField(upload_to='product_img',verbose_name='Նկարը')
price = models.DecimalField(max_digits=9,decimal_places=2,verbose_name='Գին')
date = models.DateField(verbose_name='Ամսաթիվը որի ժամանակ ստեղծվել է')
def __str__(self):
return self.title
解决方法
我怀疑问题在于您希望 products.qs
根据 django-filter
的某些逻辑进行一些过滤。但是,您模板的 "products"
上下文变量是一个简单的查询集。您可能需要使用 {% for product in filterA.qs %}
或 {% for product in filterB.qs %}
,具体取决于您要使用的过滤。