from django.conf import settings from django.core.paginator import Paginator from django import forms from django.db import models from django.views.generic import TemplateView from django.shortcuts import get_object_or_404, render 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 = [] 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": "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" } ) if self.placeholder_for_field.get(field_name): field.widget.attrs.update( { "placeholder": self.placeholder_for_field.get(field_name), } ) class ReadUpdateView(TemplateView): model: models.Model = None form_class: forms.ModelForm = None template_name: str = "" ok_template_name: str = "" error_template_name: str = "" def get_model(self): return self.model def get_object(self): pk = self.kwargs.get('pk') cls = self.get_model() return get_object_or_404(cls, pk=pk) def get_initial_values(self, instance): return {} def get_context_data(self, **kwargs): instance = self.get_object() form = self.form_class(initial=self.get_initial_values(instance)) return { "form": form, } def post(self, request, *args, **kwargs): form = self.form_class(request.POST) if form.is_valid(): instance = form.save() return render(request, self.ok_template_name, { "form": form, "instance": instance, }) return render(request, self.error_template_name, { "form": form, })