将 qs 添加到迭代器后,Jinja for 循环不起作用姜戈

问题描述

在我的项目中,我正在使用 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 }} &#8381;</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 %},具体取决于您要使用的过滤。