from django.conf import settings from django.core.paginator import Paginator class FilteredQuerysetMixin: queryset = None filter_class = None def get_filter_class(self): return self.filter_class def get_queryset(self): filter_cls = self.get_filter_class() filter_obj = filter_cls(self.request.GET) filter_obj.is_valid() qs = filter_obj.filter_queryset(self.queryset) return qs class PaginatedQuerysetMixin: objects_per_page = settings.ITEMS_PER_PAGE or 20 def get_paginated_queryset(self, qs): paginator = Paginator(qs, self.objects_per_page) page = self.request.GET.get('page', 1) qs = paginator.get_page(page) return qs class StylingMixin: placeholder_for_field = {} styled_fields = [] classes = {'input w-full'} def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.style_fields() def style_fields(self): for field_name in self.styled_fields: field = self.fields[field_name] field.required = True field.widget.attrs.update({'class': ' '.join(self.classes)}) if self.placeholder_for_field.get(field_name): field.widget.attrs.update({ 'placeholder': self.placeholder_for_field.get(field_name), })