Django提交表单后保留指定字段(仅清空amount字段)
问题描述
我有一个具备简单“保存并添加另一个”功能的Django视图,提交表单后会重定向到同一页面。
视图代码
def new_planning(request): form = PlanningForm(request.POST) if form.is_valid(): form.save() if 'another' in request.POST: messages.success(request, ('Success!')) return redirect('new_planning') else: return redirect('list_planning') return render(request, 'pages/planning/new_planning.html', context={ 'form': form, })
表单代码
class PlanningForm(forms.ModelForm): accountplan = ModelChoiceField( queryset=AccountsPlan.objects.filter(active=True).order_by('code'), ) month = forms.DateField( required=True, error_messages={'required': '', }, ) amount = forms.DecimalField( max_digits=9, decimal_places=2, required=True, validators=[ error_messages={'required': '', }, ) class Meta: model = Planning fields = '__all__'
当前功能可正常运行,但提交后页面会渲染空白表单。我希望仅清空amount字段,保留accountplan和month字段中输入的数据。是否有实现方法?
我查阅了Django文档中的instance相关内容,但这似乎不是我想要的,因为我不想从数据库获取数据,只想保留这两个字段的上次输入值。
解决方案
要实现保留指定字段值、仅清空amount的需求,不需要重定向,直接基于提交的POST数据构建新表单并重置目标字段即可,具体修改如下:
修改视图代码
def new_planning(request): if request.method == 'POST': form = PlanningForm(request.POST) if form.is_valid(): form.save() if 'another' in request.POST: messages.success(request, 'Success!') # 复制提交的POST数据,清空amount字段 new_form_data = request.POST.copy() new_form_data['amount'] = '' # 用处理后的数据构建新表单 form = PlanningForm(new_form_data) # 标记表单为绑定状态,确保模板渲染时保留已填字段值 form.is_bound = True else: # GET请求时初始化空表单 form = PlanningForm() return render(request, 'pages/planning/new_planning.html', context={ 'form': form, })
修复表单语法错误
你的表单代码中amount字段的validators列表存在语法问题(未闭合括号且缺少有效验证器),修正后示例:
amount = forms.DecimalField( max_digits=9, decimal_places=2, required=True, error_messages={'required': '', }, # 若无需额外验证器可删除validators参数,或补充完整验证器列表 # validators=[MinValueValidator(0.01),], )
实现原理
- 取消重定向逻辑,直接复用用户提交的POST数据,仅清空
amount字段后重新构建表单 - 设置
form.is_bound = True保证表单处于绑定状态,模板渲染时会自动填充accountplan和month的旧值 - 全程无需从数据库读取数据,完全基于用户本次提交的内容复用字段值
内容的提问来源于stack exchange,提问作者Zedh
相关产品推荐
相关产品推荐

