如何在Django的views.py中为表单新增字段赋值并成功保存模型数据
问题解答
1. 数据库生成user_id字段而非user的原因
如果你在Order模型中定义的user是关联用户表的外键字段,这是Django ORM的默认设计规则:
- ORM操作层面你可以通过
order.user直接访问关联的用户实体对象,符合面向对象的操作逻辑 - 数据库底层实际存储的是关联用户表的主键ID值,因此会自动给字段名加上
_id后缀,区分ORM实体对象和底层存储的主键值。
2. 表单保存缺少字段值的解决方案
你修改form.fields['user']为form.fields['user_id']的操作是错误的,不需要调整表单字段的键名,按照以下步骤实现即可:
步骤1:表单类排除user字段
在forms.py的ModelForm中直接排除不需要前端提交的user字段:
from django import forms from .models import Order class OrderForm(forms.ModelForm): class Meta: model = Order # 填写你需要前端展示的其他字段,或者用exclude排除user exclude = ['user']
步骤2:视图层手动赋值user字段
调用form.save()时先传入commit=False生成未写入数据库的临时实例,手动赋值user字段后再保存到数据库即可:
def create_order(request): if request.method == "POST": form = OrderForm(request.POST) if form.is_valid(): # 生成临时实例,不提交到数据库 order = form.save(commit=False) # 手动赋值当前登录用户 order.user = request.user # 正式提交到数据库 order.save() return redirect("订单列表页对应路由名") else: form = OrderForm() return render(request, "订单提交页模板路径", {"form": form})
该实现方式完全符合你的安全需求,避免了前端恶意篡改订单所属用户的风险。
内容的提问来源于stack exchange,提问作者Rattlefire
相关产品推荐
相关产品推荐

