Благодаря 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 }}
Круто, круто ))
Информация полезная, но текст очень похоже на машинный перевод.
Может быть, а может и нет, все имеют различную речь.. не могу отвечать за всех пользователей ресурса.. поскольку каждый пользователь может дополнить материал ресурса статьями.