52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
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})
|