如何在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
相关产品推荐
相关产品推荐

