Django中自动将模型ForeignKey字段设置为当前登录用户的实现方案咨询
Django中自动将模型ForeignKey字段设置为当前登录用户的实现方案咨询
嗨,我来帮你搞定这个问题!你之前遇到的IntegrityError是因为你把save_model方法写在了模型类里,但这个方法其实是Django Admin后台管理类专属的方法,模型本身并不会调用它,所以创建Task时auther字段还是空的,触发了非空约束错误。
下面给你两种可行的解决方案,优先推荐第一种,简单直接:
方案一:重写CreateView的form_valid方法(最推荐)
在你的AddTaskView中重写form_valid方法,在表单保存前主动把当前登录用户赋值给auther字段,这样就不需要在前端表单里显示用户选择项了:
class AddTaskView(SuccessMessageMixin, CreateView): model = Task template_name = 'add_task.html' fields = ['priority','title','description'] success_message = "Task was created successfully" def form_valid(self, form): # 在表单保存前,将当前登录用户绑定到auther字段 form.instance.auther = self.request.user # 调用父类的form_valid完成保存逻辑 return super().form_valid(form)
如果还想限制用户只能修改自己创建的任务,可以给UpdateTaskView也加个过滤逻辑:
class UpdateTaskView(SuccessMessageMixin, UpdateView): model = Task template_name = 'update_task.html' fields = ['priority','title','description'] success_message = "Task was updated successfully" def get_queryset(self): # 只返回当前用户创建的任务,防止用户修改他人任务 return Task.objects.filter(auther=self.request.user)
方案二:使用Django Admin的save_model(仅后台生效)
如果你之前的save_model是想针对后台管理页面的话,需要把它写在Admin管理类里,而不是模型类:
在admin.py中注册Task时,自定义Admin类:
from django.contrib import admin from .models import Task class TaskAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): # 后台创建/修改任务时自动设置当前登录用户为auther obj.auther = request.user super().save_model(request, obj, form, change) admin.site.register(Task, TaskAdmin)
不过这个方法只对后台管理页面的操作生效,你的前端AddTaskView还是需要用方案一的方式处理。
为什么你之前的尝试失败了?
你把save_model写在了Task模型类里,但这个方法是Django Admin的ModelAdmin类的方法,模型本身没有这个方法,所以当你通过前端视图创建Task时,根本不会触发这个方法,auther字段自然还是空的,导致了非空约束错误。
备注:内容来源于stack exchange,提问作者Daniel Marsh
相关产品推荐
相关产品推荐

