Фильтр категорий из списка товаров в шаблонах Django
Итак, я работаю над сайтом электронной коммерции на Django, где я должен фильтровать продукты на моей странице на основе трех отдельных категорий. Поскольку есть только три фиксированные категории, я решил создать словарь в классе модели для Products и подумал, что будет способ фильтровать продукты позже в моих шаблонах соответствующим образом, используя цикл {%For%}.
Это не работает так, как я ожидал, и я получаю ошибки, возможно, потому что я не так хорошо знаком с Django и не знаю, как в нем разобраться. Буду очень признателен за помощь! (Я приложил несколько скриншотов для контекста)
рабочая реализация цикла 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)
Это основная концепция того, что решит вашу проблему.