Django如何在创建模型对象时自动关联当前登录用户,无需手动选择
实现方案
首先明确:Django 模型层默认无法直接访问请求对象request,不要尝试在 Model 内部写逻辑获取当前用户,关联逻辑需要放在视图层或者 Admin 配置中实现,对应两种常用场景的操作方法如下:
场景1:通过 Django Admin 后台提交数据
在应用的admin.py中重写对应模型 Admin 类的save_model方法即可:
from django.contrib import admin from .models import SomeText class SomeTextAdmin(admin.ModelAdmin): # 隐藏user字段,不需要手动选择 exclude = ('user',) def save_model(self, request, obj, form, change): # 仅新增对象时赋值,修改操作不覆盖原有关联用户 if not change: obj.user = request.user super().save_model(request, obj, form, change) admin.site.register(SomeText, SomeTextAdmin)
场景2:自定义前端表单/视图处理提交
使用类视图(如CreateView)
重写form_valid方法注入用户,注意引入登录校验Mixin避免匿名用户访问报错:
from django.views.generic.edit import CreateView from django.contrib.auth.mixins import LoginRequiredMixin from .models import SomeText class SomeTextCreateView(LoginRequiredMixin, CreateView): model = SomeText fields = ['keyword'] # 仅开放用户需要输入的字段 def form_valid(self, form): form.instance.user = self.request.user return super().form_valid(form)
使用函数视图
保存对象前手动赋值即可,注意加登录校验装饰器:
from django.shortcuts import redirect, render from django.contrib.auth.decorators import login_required from .models import SomeText @login_required def create_sometext(request): if request.method == "POST": SomeText.objects.create( user=request.user, keyword=request.POST.get('keyword') ) return redirect('你的成功跳转路由名') return render(request, '你的表单模板路径.html')
内容的提问来源于stack exchange,提问作者Rin
相关产品推荐
相关产品推荐

