如何将Django处理POST表单校验的函数视图转为类视图
Django 函数视图转 FormView 类视图实现
需求说明
- 接收POST请求传递的表单数据
- 实例化表单对象完成数据合法性校验
- 校验通过、校验失败分别返回对应响应
- 将已实现的函数视图改写为Django类视图形式
原有函数视图代码
from django.http import HttpResponse from .forms import contact_form def contact_us(request): if request.method == "POST": form = contact_form(request.POST) if form.is_valid(): return HttpResponse("Data is valid") else: return HttpResponse("Data is invalid")
类视图实现方案
你提供的类视图草稿存在两处笔误:get方法的第一个参数delf为拼写错误,应为类实例方法固定参数self;get方法的注释描述错误,该方法用于处理GET请求而非POST请求。
方案1:直接补全post、get方法(完全对齐原有函数视图逻辑)
直接在你现有草稿结构上补全逻辑,和原函数视图执行逻辑完全一致:
from django.http import HttpResponse from django.views.generic.edit import FormView from .forms import contact_form class ContactUsView(FormView): form_class = contact_form def post(self, request, *args, **kwargs): # 实例化绑定POST数据的表单对象 form = self.get_form() if form.is_valid(): return HttpResponse("Data is valid") else: return HttpResponse("Data is invalid") def get(self, request, *args, **kwargs): # 处理GET请求,可按需返回空表单页面或提示 return HttpResponse("Please submit form via POST")
方案2:使用FormView内置封装逻辑(推荐)
FormView已经内置了GET/POST请求分流、表单实例化的通用逻辑,不需要手动重写post、get方法,只需要重写校验成功、失败的回调方法即可,代码更简洁,后续扩展模板渲染、成功跳转等功能更方便:
from django.http import HttpResponse from django.views.generic.edit import FormView from .forms import contact_form class ContactUsView(FormView): # 绑定使用的表单类 form_class = contact_form # 如需渲染表单页面,直接配置模板路径即可,无需手动写GET逻辑 # template_name = "contact.html" def form_valid(self, form): # 表单校验通过时自动执行 return HttpResponse("Data is valid") def form_invalid(self, form): # 表单校验不通过时自动执行 return HttpResponse("Data is invalid")
路由配置注意事项
类视图配置路由时,需要调用as_view()方法进行包装,示例:
from django.urls import path from .views import ContactUsView urlpatterns = [ path("contact/", ContactUsView.as_view(), name="contact_us"), ]
内容的提问来源于stack exchange,提问作者smit patel
相关产品推荐
相关产品推荐

