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

如何在Django中将用户提交的表单数据传入success_url?

优化Django FormView表单提交后重定向的实现方式

你的当前写法直接返回redirect确实会跳过FormView默认form_valid方法里的一些逻辑(比如触发信号、执行父类的通用流程),更符合Django类视图设计的方式是通过重写get_success_url来动态生成带参数的跳转URL,同时保留父类的form_valid流程:

改进后的代码

class BillsSelectMonthView(GetFormKwargsMixin, FormView):
    form_class = SelectMonthAndCustomerForm
    template_name = 'customers/bills_select_month.html'
    # 可保留默认success_url作为降级方案,或直接删除,会被get_success_url覆盖
    success_url = reverse_lazy('customers:bills_select_month')
    current_page_name = PAGE_NAME_BILLS

    def form_valid(self, form):
        # 将表单数据保存为实例属性,供后续get_success_url调用
        self.month_year = form.cleaned_data['month']
        self.customer = form.cleaned_data['customer']
        # 调用父类form_valid,执行默认逻辑(如表单保存、钩子触发等)
        return super().form_valid(form)

    def get_success_url(self):
        # 动态生成带kwargs的跳转URL
        return reverse(
            'customers:bills_preview',
            kwargs={
                'month': int(self.month_year.month),
                'year': int(self.month_year.year),
                'customer_id': int(self.customer.pk)
            }
        )

为什么这样更优

  • 遵循Django类视图生命周期:父类form_valid会处理表单默认逻辑(比如表单save()方法调用、通用视图流程),不会跳过内部方法。
  • 职责划分清晰:form_valid专注于验证后的数据暂存,get_success_url专注于跳转地址生成,符合单一职责原则。
  • 可维护性更强:后续修改跳转规则只需调整get_success_url,无需改动表单验证逻辑。

内容的提问来源于stack exchange,提问作者Kaushik Tank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:03:10