Django项目中将函数式表单视图转换为类视图的实现问题
Django 函数视图转类视图实现方案
你当前的表单提交场景可以直接用 Django 内置的 FormView 类视图实现,完全对齐原有逻辑不需要修改模板代码,具体实现如下:
转换后的类视图代码
from django.views.generic.edit import FormView from django.contrib import messages from .models import Info from .forms import infoForm class AddBusinessPlanView(FormView): # 基础配置:指定表单类、渲染模板、提交成功后当前页重载 form_class = infoForm template_name = 'businessplan/businessplan.html' success_url = '.' # 注入模板额外上下文,对应原逻辑里的Info查询集、默认提交状态 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['Info'] = Info.objects.all() context['successful_submit'] = False return context # 表单校验通过后的逻辑,对应原函数中form.is_valid()后的处理 def form_valid(self, form): form.save() business_name = form.cleaned_data.get('businessName') info_id = form.instance.id messages.success(self.request, f'PDF created for {business_name}!, No.({info_id})') # 修改提交状态后返回渲染结果,和原有行为完全一致 context = self.get_context_data(form=form) context['successful_submit'] = True return self.render_to_response(context) # 表单校验失败后的逻辑,保留原错误打印逻辑 def form_invalid(self, form): print(form.errors) return super().form_invalid(form)
路由修改
把原函数视图的路由配置改为类视图调用即可:
# 原路由写法 # path('add-business-plan/', add_business_plan, name='add_business_plan') # 替换为类视图写法 path('add-business-plan/', AddBusinessPlanView.as_view(), name='add_business_plan')
说明
- 所有上下文变量的key和原逻辑完全一致,不需要改动现有模板代码
- 如果后续需要避免表单重复提交,可把
form_valid的返回逻辑改为重定向,只需要修改对应位置即可 - 原GET请求中打印空表单错误的逻辑无实际意义,这里保留为仅校验失败时打印错误信息
内容的提问来源于stack exchange,提问作者A_K
相关产品推荐
相关产品推荐

