1fromcollections.abcimportCallable 2fromtypingimportTYPE_CHECKING 3 4fromplain.exceptionsimportImproperlyConfigured 5fromplain.httpimportResponse,ResponseRedirect 6 7from.templatesimportTemplateView 8 9ifTYPE_CHECKING:10fromplain.formsimportBaseForm111213classFormView(TemplateView):14"""A view for displaying a form and rendering a template response."""1516form_class:type["BaseForm"]|None=None17success_url:Callable|str|None=None1819defget_form(self)->"BaseForm":20"""Return an instance of the form to be used in this view."""21ifnotself.form_class:22raiseImproperlyConfigured(23f"No form class provided. Define {self.__class__.__name__}.form_class or override "24f"{self.__class__.__name__}.get_form()."25)26returnself.form_class(**self.get_form_kwargs())2728defget_form_kwargs(self)->dict:29"""Return the keyword arguments for instantiating the form."""30return{31"initial":{},32"request":self.request,33}3435defget_success_url(self,form:"BaseForm")->str:36"""Return the URL to redirect to after processing a valid form."""37ifnotself.success_url:38raiseImproperlyConfigured("No URL to redirect to. Provide a success_url.")39returnstr(self.success_url)# success_url may be lazy4041defform_valid(self,form:"BaseForm")->Response:42"""If the form is valid, redirect to the supplied URL."""43returnResponseRedirect(self.get_success_url(form))4445defform_invalid(self,form:"BaseForm")->Response:46"""If the form is invalid, render the invalid form."""47context={48**self.get_template_context(),49"form":form,50}51returnself.get_template().render(context)5253defget_template_context(self)->dict:54"""Insert the form into the context dict."""55context=super().get_template_context()56context["form"]=self.get_form()57returncontext5859defpost(self)->Response:60"""61 Handle POST requests: instantiate a form instance with the passed62 POST variables and then check if it's valid.63 """64form=self.get_form()65ifform.is_valid():66returnself.form_valid(form)67else:68returnself.form_invalid(form)