from typing import Type from django import forms from django.db import models from django.shortcuts import render from django.views.generic import TemplateView class HTMXFormComponent(TemplateView): form_class: Type[forms.ModelForm] = None template_name: str = 'components/default/form.html' hx_trigger = '' view_name = '' save_button_text = '' def get_view_name(self): return self.view_name def get_form_class(self) -> Type[forms.ModelForm]: return self.form_class def get_form(self, initial=True): instance = self.get_object() if initial: return self.form_class(initial=self.get_initial_values(instance), instance=instance) return self.form_class(self.request.POST, instance=instance) def get_object(self) -> models.Model: raise NotImplementedError def get_initial_values(self, instance): return {} def get_context_data(self, **kwargs): form = self.get_form() return {'form': form, 'url': self.get_view_name(), 'save_button_text': self.save_button_text} def post(self, request, *args, **kwargs): form = self.get_form(initial=False) if form.is_valid(): instance = form.save() response = render(request, self.template_name, {'form': form, 'instance': instance}) response['HX-Trigger'] = self.hx_trigger return response return render(request, self.template_name, {'form': form, 'save_button_text': self.save_button_text})