Django中使用ModelForm提交POST请求时,更新对象前修改字段无法保存至数据库的问题求助
解决Django表单修改字段后无法保存到数据库的问题
我来帮你搞定这个问题!你之前的尝试没成功,核心原因是直接修改表单实例的属性(比如f.str1)并不会改变最终要写入数据库的数据——Django表单的字段值是存储在cleaned_data字典中,或者需要通过表单生成的模型实例来修改。下面给你两种可靠的解决方法:
方法一:使用commit=False获取模型实例后修改(推荐)
这种方式最直观,先让表单生成未保存的模型实例,修改字段后再写入数据库:
class ProvisioningDetails(View): def post(self, request, provisioning_ptr_id, terminal_id, site_id): # 先获取要更新的数据库实例 provisioning_obj = Provisioning.objects.get(provisioning_ptr_id=provisioning_ptr_id) # 用POST数据和现有实例初始化表单 form = ProvisioningForm(request.POST, instance=provisioning_obj) if form.is_valid(): # 生成模型实例但不立即保存到数据库 updated_instance = form.save(commit=False) # 修改str1字段的值 updated_instance.str1 = "some new data" # 现在将修改后的实例保存到数据库 updated_instance.save() return redirect( "provisionings_show_view", site_id, terminal_id, provisioning_ptr_id )
方法二:修改表单的cleaned_data字典
表单验证通过后,cleaned_data里是经过校验的字段值,修改这个字典后再保存也能生效:
class ProvisioningDetails(View): def post(self, request, provisioning_ptr_id, terminal_id, site_id): provisioning_obj = Provisioning.objects.get(provisioning_ptr_id=provisioning_ptr_id) form = ProvisioningForm(request.POST, instance=provisioning_obj) if form.is_valid(): # 修改cleaned_data中的str1值 form.cleaned_data['str1'] = "some new data" # 保存表单,此时会使用修改后的cleaned_data更新数据库 form.save() return redirect( "provisionings_show_view", site_id, terminal_id, provisioning_ptr_id )
为什么之前的代码无效?
你直接给form.str1赋值时,这个属性并不是表单用来存储待保存字段值的地方——表单的字段数据实际存在cleaned_data或者内部的data结构中,直接修改表单实例的属性不会被Django的表单处理逻辑识别,自然不会同步到数据库。
内容的提问来源于stack exchange,提问作者Richard Live
相关产品推荐
相关产品推荐

