bernar92
bernar9217 травня 2018 р. 11:50

Як я використав FilterView замість ListView для спрощення фільтрації

Завдяки 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 }}

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Evgenii Legotckoi
  • 17 травня 2018 р. 17:03

Круто, круто ))

Спасибо за ценный материал для всего сообщества.
Отмечу, что на сегодняшний день уже можно спокойно переходить на django-bootstrap4 .
А также подружить django-bootstrap4 c bootstrap-material-design . Эта связка вполне успешно работает. Нужно лишь править некоторые мелочи.
ПК
  • 19 травня 2018 р. 07:04

Информация полезная, но текст очень похоже на машинный перевод.

Evgenii Legotckoi
  • 19 травня 2018 р. 08:27

Может быть, а может и нет, все имеют различную речь.. не могу отвечать за всех пользователей ресурса.. поскольку каждый пользователь может дополнить материал ресурса статьями.

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 08:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 08:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
i
innorwall14 листопада 2024 р. 19:42
Як скопіювати файли в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
i
innorwall14 листопада 2024 р. 17:09
Qt/C++ - Підручник 068. Hello World за допомогою системи збирання CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
i
innorwall14 листопада 2024 р. 12:05
EVILEG-CORE. Використання Google reCAPTCHA 2001; 98 29 34 priligy buy
i
innorwall14 листопада 2024 р. 12:00
PyQt5 - Урок 007. Працює з QML QtQuick (Сигнали та слоти) priligy 30mg Am J Obstet Gynecol 171 1488 505
Тепер обговоріть на форумі
i
innorwall14 листопада 2024 р. 11:39
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
i
innorwall11 листопада 2024 р. 18:55
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
9
9Anonim25 жовтня 2024 р. 16:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Игорь Максимов03 жовтня 2024 р. 11:05
Реализация навигации по разделам Спасибо Евгений!

Слідкуйте за нами в соціальних мережах