簡體   English   中英

靈活的 Django 過濾器(django-filter 包)

[英]Flexible Django Filter (django-filter package)

我目前正在實施一些過濾器,但我面臨着多個問題。 首先,我的復選框在點擊品牌名稱時起作用,而不是實際的: 在此處輸入圖像描述

這是我的 html 代碼:

<form method="get">
    <div class="toggle-list product-categories">
        <h6 class="title">Sorteer</h6>
        <div class="shop-submenu">
            <ul>
                {{ filter.form.order_by }}
            </ul>
        </div>
    </div>
    <div class="toggle-list product-categories">
        <h6 class="title">Merk(en)</h6>
        <div class="shop-submenu">
            <ul>
            {% for f in filter.form.brand %}
                <li>
                   <input type="checkbox" name="brand" id="brand">
                   <label for="brand">{{ f }}</label>
                </li>
            {% endfor %}
            </ul>
        </div>
    </div>
    <input type="submit" value="Filter">
</form>

我在 filters.py 中的過濾器:

class SortFilter(django_filters.FilterSet):
    ORDER_BY_CHOICES = (
        ('-discount_sort', 'Hoogste korting'),
        ('-new_price', 'Hoogste prijs'),
        ('new_price', 'Laagste prijs'),
    )
    order_by = django_filters.ChoiceFilter(label='Sorteer op', choices=ORDER_BY_CHOICES, method='filter_by_order',
                                           empty_label=None)
    brand = django_filters.ModelMultipleChoiceFilter(queryset=Product.objects
                                                     .order_by('brand')
                                                     .filter(categorie='eiwitten')
                                                     .values_list('brand', flat=True).distinct()
                                                     , widget=forms.CheckboxSelectMultiple, required=False)

    class Meta:
        model = Product
        fields = ['brand']

    def filter_by_order(self, queryset, name, value):
        return queryset.order_by(value)

查看此特定頁面的 function:

def eiwit(request):
    # filter alleen eiwitproducten
    eiwit_list = ['eiwitten']
    eiwit_filter = Q()
    for item in eiwit_list:
        eiwit_filter = eiwit_filter | Q(categorie=item)

    products = models.Product.objects.filter(eiwit_filter)
    product_amount = len(products)

    # sorteer filter
    filtered = SortFilter(
        request.GET,
        queryset=products
    )

    # paginator
    paginator = Paginator(filtered.qs, 12)
    page = request.GET.get('page')
    try:
        response = paginator.page(page)
    except PageNotAnInteger:
        response = paginator.page(1)
    except EmptyPage:
        response = paginator.page(paginator.num_pages)
    product_front_end = {
        'final_products': response,
        'filter': filtered,
        'count': product_amount,
    }
    return render(request, 'producten/eiwit.html', product_front_end)

其次,我希望過濾器更通用。 因為在所有類別中都有不同數量的品牌。 如您所見,我目前通過選擇“eiwitten”類別(在 filters.py 中)中的所有“品牌”值來創建選項。 有沒有辦法用變量(如'eiwittien')調用 views.py 中的過濾器。 哪個將用於根據它所在的頁面調整 filter.py 中的過濾器? 這樣我就有了所有類別的動態過濾器。

這可能有助於解決您的一些問題。 您的輸入標簽缺少有關名稱/ID 字段的信息。 您應該能夠通過添加模板標簽來填充這些值來填充這些值。

<input type="checkbox" id="BSN" name="BSN"> <label for="BSN">BSN</label>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM