Фильтр категорий из списка товаров в шаблонах Django

Итак, я работаю над сайтом электронной коммерции на Django, где я должен фильтровать продукты на моей странице на основе трех отдельных категорий. Поскольку есть только три фиксированные категории, я решил создать словарь в классе модели для Products и подумал, что будет способ фильтровать продукты позже в моих шаблонах соответствующим образом, используя цикл {%For%}.

Это не работает так, как я ожидал, и я получаю ошибки, возможно, потому что я не так хорошо знаком с Django и не знаю, как в нем разобраться. Буду очень признателен за помощь! (Я приложил несколько скриншотов для контекста)

Снимок экрана MODELS.products

рабочая реализация цикла for, который напрямую показывает все товары

Виды.каталог

Я использую Class Based Views для решений. В основном вы хотите показать список товаров по категориям. Поэтому решение выглядит следующим образом.

на views.py класс представления выглядит следующим образом:

from django.views.generic import ListView
from .models import Product

class ProductListView(ListView):
    model = Product
    queryset = model.objects.all()
    context_object_name = 'products'
    template_name = 'your-template-path'

    def get_queryset(self):
        queryset = super(ProductListView, self).get_queryset()
        category = self.request.GET.get('category', None)
        if category:
            return queryset.filter(category=category)
        return queryset

Теперь отправьте значения категорий в параметр URL, используя ключевое слово category. Я не использую никакой системы аутентификации. Пожалуйста, реализуйте это самостоятельно

Моя рекомендация состоит в том, чтобы добавить anchor tag внутри for loop, который будет содержать category name, который затем можно передать как keyword в определенный url для категорий.

Например:

В html...

{% for product in products %}
     ...
     # Adding this anchor tag to your existing code within the loop that will display each product's category.
     # Also you can now send this category name to a specific view to filter the products
     
     <a href="{% url 'category' product.category %}">{{ product.category|title }}</a>
     # Notice that I have passed product.category as a keyword in {% url 'category' product.category %} 
     ...
{% endfor %}

Теперь в вашем urls.py файле просто создайте url для обработки категорий, переданных в качестве ключевых слов.

from .views import category_view  # Importing the new view

urlpatterns = [
     ...    
     path('category/<str:category>/', category_view, name='category'),
     ...
]

Из файла views.py.

def category_view(request, category): # Accepting the category passed here
     # You can have any other operations in here if necessary

     products = Product.objects.filter(category__iexact=category)

     context = {
          ...
          'products': products,
          ...
     }
     return render(request, 'products.html', context)

Это основная концепция того, что решит вашу проблему.

Вернуться на верх