You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:30:05