如何避免Django项目中函数视图出现的重复代码问题?
方案合理性判断
你的封装思路完全合理,已经实现了核心逻辑的收拢,符合DRY(不要重复自己)的开发原则,当前阶段如果差异点只有重定向地址和模板的话,这套实现完全可以正常运行。
可优化点
你提到后续可能会出现表单类不同的需求,且当前公共函数里还硬编码了MyForm、do_something()、and_something_else()逻辑,可进一步扩展参数提升通用性:
def generic_form_view(request, success_redirect_url, template, form_class, success_callback=None): form = form_class(request.POST or None) if request.method == "POST": if form.is_valid(): # 执行通用成功逻辑 do_something() and_something_else() # 支持传入视图独有的成功处理逻辑 if success_callback: success_callback(form, request) return redirect(success_redirect_url) return render(request, template, {'form': form})
优化后调用示例
# 基础用法,仅替换表单、模板、重定向地址 def my_view1(request): return generic_form_view( request, success_redirect_url='another_page', template='my/template.html', form_class=MyForm1 ) # 自定义成功后逻辑的用法 def my_view2(request): def custom_handle(form, request): form.save() request.session['tip'] = '提交成功' return generic_form_view( request, success_redirect_url='other_page', template='my/template2.html', form_class=MyForm2, success_callback=custom_handle )
备选方案:使用Django原生FormView
如果你项目中这类表单处理场景较多,也可以直接用Django自带的基于类的视图FormView,原生就封装了表单渲染、验证、重定向的全流程,是Django生态的惯用写法:
from django.views.generic.edit import FormView # 封装通用逻辑的基类 class BaseFormView(FormView): def form_valid(self, form): do_something() and_something_else() return super().form_valid(form) # 业务视图直接继承修改属性即可 class MyView1(BaseFormView): form_class = MyForm1 template_name = 'my/template.html' success_url = 'another_page' class MyView2(BaseFormView): form_class = MyForm2 template_name = 'my/template2.html' success_url = 'other_page' # 自定义成功逻辑直接重载form_valid即可 def form_valid(self, form): form.save() self.request.session['tip'] = '提交成功' return super().form_valid(form)
内容的提问来源于stack exchange,提问作者David Emanuel Sandoval
相关产品推荐
相关产品推荐

