在Django中保存ModelForm时如何传入用户模型作为ForeignKey值?
解决Django中ModelForm自动关联当前登录用户的问题
这事儿我做项目时也碰到过,其实核心就是在表单保存环节手动把当前登录用户绑定到ForeignKey字段上就行——毕竟你已经在表单里把rel_user排除在外了(总不能让用户手动选自己对吧),具体操作如下:
步骤1:确保用户已登录
首先得保证访问提交页面的用户是登录状态,不然拿不到有效的用户对象。用Django内置的login_required装饰器就能轻松实现登录验证:
步骤2:修改视图的保存逻辑
当表单验证通过后,别直接调用form.save(),而是先调用form.save(commit=False)——这个参数会让Django生成Book模型实例,但暂时不存入数据库。接着给实例的rel_user字段赋值为当前登录用户request.user,最后再完成保存。
修改后的完整views.py代码如下:
from django.shortcuts import render, redirect from Books.forms import BookForm from django.contrib import messages from django.contrib.auth.decorators import login_required # 新增登录验证装饰器的导入 @login_required # 新增装饰器,强制用户登录后才能访问该页面 def sell(request): if request.method == "GET": form = BookForm() else: form = BookForm(request.POST) if form.is_valid(): # 创建模型实例但暂不保存到数据库 book_instance = form.save(commit=False) # 关联当前登录用户到rel_user字段 book_instance.rel_user = request.user # 正式将数据保存到数据库 book_instance.save() messages.success(request, "Successfully added!") return redirect('sell') else: messages.error(request, "Please fill in all the fields correctly.") return render(request, 'Books/sell.html', {"form": form})
为什么要这么做?
commit=False是核心:它允许我们在模型实例真正存入数据库前,补充或修改字段值,这里就是给必填的rel_user字段补全用户信息。login_required能避免匿名用户提交的问题:匿名用户的request.user是AnonymousUser,没法作为ForeignKey关联到用户模型,会直接导致数据库报错。
这样修改后,每次登录用户提交表单,系统都会自动把该用户和图书信息关联并存入数据库啦~
内容的提问来源于stack exchange,提问作者arujbansal
相关产品推荐
相关产品推荐

