feat: mixin for update forms
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
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 = ""
|
||||
|
||||
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(),
|
||||
}
|
||||
|
||||
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,
|
||||
},
|
||||
)
|
||||
Reference in New Issue
Block a user