Завдяки FilterView можна спростити та зменшити код для відображення товарів, продуктів тощо. Що дозволить зменшити код у рази! Спочатку я використав ListView і писав багато коли для того, щоб можна було б відфільтрувати за запитами. Поки що один із хороших знайомих мені не порадив django-filter . Прочитавши про нього більше я зрозумів, що це те, що потрібно. Після, коли я хотів усі свої юшки використовувати як об'єкт. Це мене трохи спантеличило, поки знайомий знову мене не врятував підказкою про використання FilterView, а тепер докладніше обговоримо її:
Ми маємо модель Product яка має категорію Collection.
class Collection(models.Model): name = models.CharField(verbose_name='Коллекция', max_length=150, default=None) slug = models.SlugField(verbose_name='ссылка') is_active = models.BooleanField(verbose_name='Статус активности', default=True) class Meta: db_table = 'collection' verbose_name = 'Коллекция' verbose_name_plural = 'Коллекции' ordering = ('name',) def __str__(self): return self.name class Product(models.Model): name = models.CharField('название товара', max_length=200) category = models.ForeignKey(Category, blank=True, null=True, verbose_name='Категория') collection = models.ForeignKey(Collection, blank=True, null=True, verbose_name='Коллекция') price = models.IntegerField(verbose_name='цена в ₸', default=0) discount = models.IntegerField(verbose_name='скидка в %', default=0) recommended = models.BooleanField(verbose_name='Рекомендуемый товар', default=False) ....
Нам потрібно відобразити її в шаблоні так, щоб можна було фільтрувати або сортувати, як ми хочемо. Для цього ми створимо filters.py де напишемо:
Ничем не отличается от джанго формы import django_filters from .models import Product CHOICES =[ ["name", "по алфавиту"], ["price", "дешевые сверху"], ["-price", "дорогие сверху"] ] class ProductFilter(django_filters.FilterSet): name = django_filters.CharFilter(name='name', lookup_expr='icontains') category__slug = django_filters.CharFilter() price__gt = django_filters.NumberFilter(name='price', lookup_expr='gt') price__lt = django_filters.NumberFilter(name='price', lookup_expr='lt') ordering = django_filters.OrderingFilter(choices=CHOICES, required=True, empty_label=None,) class Meta: model = Product exclude = [field.name for field in Product._meta.fields] order_by_field = 'name'
Далі створюємо юшку яка успадковується від FilterView
class CollectionViews(FilterView): template_name = 'product/coolections.html' model = Product paginate_by = 10 filterset_class = ProductFilter context_object_name = 'products' def get_queryset(self): qs = self.model.objects.prefetch_related('photo_set') if self.kwargs.get('collec_slug'): qs = qs.filter(collection__slug=self.kwargs['collec_slug']) return qs
Якщо ви користуєтеся bootstrap можна використовувати #### django-bootstrap3
{% load bootstrap_tags %} {{ form|as_bootstrap }}
Круто, круто ))
Информация полезная, но текст очень похоже на машинный перевод.
Может быть, а может и нет, все имеют различную речь.. не могу отвечать за всех пользователей ресурса.. поскольку каждый пользователь может дополнить материал ресурса статьями.