bernar92
17 травня 2018 р. 21:50

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

Завдяки FilterView можна спростити та зменшити код для відображення товарів, продуктів тощо. Що дозволить зменшити код у рази! Спочатку я використав ListView і писав багато коли для того, щоб можна було б відфільтрувати за запитами. Поки що один із хороших знайомих мені не порадив django-filter . Прочитавши про нього більше я зрозумів, що це те, що потрібно. Після, коли я хотів усі свої юшки використовувати як об'єкт. Це мене трохи спантеличило, поки знайомий знову мене не врятував підказкою про використання FilterView, а тепер докладніше обговоримо її:


Ми маємо модель Product яка має категорію Collection.

  1. class Collection(models.Model):
  2. name = models.CharField(verbose_name='Коллекция', max_length=150, default=None)
  3. slug = models.SlugField(verbose_name='ссылка')
  4. is_active = models.BooleanField(verbose_name='Статус активности', default=True)
  5.  
  6. class Meta:
  7. db_table = 'collection'
  8. verbose_name = 'Коллекция'
  9. verbose_name_plural = 'Коллекции'
  10. ordering = ('name',)
  11.  
  12. def __str__(self):
  13. return self.name
  14.  
  15. class Product(models.Model):
  16. name = models.CharField('название товара', max_length=200)
  17. category = models.ForeignKey(Category, blank=True, null=True, verbose_name='Категория')
  18. collection = models.ForeignKey(Collection, blank=True, null=True, verbose_name='Коллекция')
  19. price = models.IntegerField(verbose_name='цена в ₸', default=0)
  20. discount = models.IntegerField(verbose_name='скидка в %', default=0)
  21. recommended = models.BooleanField(verbose_name='Рекомендуемый товар', default=False)
  22. ....

Нам потрібно відобразити її в шаблоні так, щоб можна було фільтрувати або сортувати, як ми хочемо. Для цього ми створимо filters.py де напишемо:

  1. Ничем не отличается от джанго формы
  2.  
  3. import django_filters
  4. from .models import Product
  5.  
  6. CHOICES =[
  7. ["name", "по алфавиту"],
  8. ["price", "дешевые сверху"],
  9. ["-price", "дорогие сверху"]
  10. ]
  11.  
  12.  
  13. class ProductFilter(django_filters.FilterSet):
  14. name = django_filters.CharFilter(name='name', lookup_expr='icontains')
  15. category__slug = django_filters.CharFilter()
  16. price__gt = django_filters.NumberFilter(name='price', lookup_expr='gt')
  17. price__lt = django_filters.NumberFilter(name='price', lookup_expr='lt')
  18. ordering = django_filters.OrderingFilter(choices=CHOICES, required=True, empty_label=None,)
  19.  
  20. class Meta:
  21. model = Product
  22. exclude = [field.name for field in Product._meta.fields]
  23. order_by_field = 'name'

Далі створюємо юшку яка успадковується від FilterView

  1. class CollectionViews(FilterView):
  2. template_name = 'product/coolections.html'
  3. model = Product
  4. paginate_by = 10
  5. filterset_class = ProductFilter
  6. context_object_name = 'products'
  7.  
  8. def get_queryset(self):
  9. qs = self.model.objects.prefetch_related('photo_set')
  10. if self.kwargs.get('collec_slug'):
  11. qs = qs.filter(collection__slug=self.kwargs['collec_slug'])
  12. return qs

Якщо ви користуєтеся bootstrap можна використовувати #### django-bootstrap3

{% load bootstrap_tags %} {{ form|as_bootstrap }}

Рекомендовані статті на цю тему

По статті запитували0питання

5

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

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

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

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

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

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

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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • Evgenii Legotckoi
    16 квітня 2025 р. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…