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 = { "my-2", "bg-gray-50", "border", "border-gray-300", "text-gray-900", "sm:text-sm rounded-lg", "focus:ring-primary-600", "focus:border-primary-600", "block", "w-full", "p-2.5", "dark:bg-gray-700", "dark:border-gray-600", "dark:placeholder-gray-400", "dark:text-white", "dark:focus:ring-primary-500", "dark:focus:border-primary-500", } 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), } )