Django如何将当前登录用户自动设为Post模型作者且不允许修改
Django的模型层本身不持有请求上下文,无法直接获取当前登录用户,你需要在视图层处理author字段的赋值即可,具体操作步骤如下:
1. 调整表单配置,隐藏作者字段
创建Post对应的ModelForm时,不要将author加入可编辑字段列表,避免前端用户恶意篡改作者信息:
from django.forms import ModelForm from .models import Post class PostForm(ModelForm): class Meta: model = Post # 仅保留允许用户编辑的字段,不包含author fields = ['title', 'slug', 'body', 'status', 'category']
如果使用通用类视图,直接在fields参数中排除author即可。
2. 视图层手动赋值当前登录用户
如果你使用函数视图
提交表单验证通过后,先暂存表单数据不写入数据库,给author赋值当前登录用户后再保存:
from django.shortcuts import render, redirect from .forms import PostForm from django.contrib.auth.decorators import login_required # 该装饰器保证只有登录用户可访问发布页 @login_required def post_create(request): if request.method == 'POST': form = PostForm(request.POST) if form.is_valid(): # commit=False表示仅生成模型对象,不写入数据库 post = form.save(commit=False) # 赋值当前登录用户为作者 post.author = request.user post.save() return redirect('index') else: form = PostForm() return render(request, 'post_create.html', {'form': form})
如果你使用通用类视图
重写form_valid方法完成作者赋值即可:
from django.views.generic.edit import CreateView from .models import Post from django.contrib.auth.mixins import LoginRequiredMixin class PostCreateView(LoginRequiredMixin, CreateView): model = Post fields = ['title', 'slug', 'body', 'status', 'category'] def form_valid(self, form): form.instance.author = self.request.user return super().form_valid(form)
3. 编辑场景补充作者校验(可选)
如果需要支持帖子编辑功能,额外加一层校验,仅允许作者本人修改自己的帖子:
from django.views.generic.edit import UpdateView from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): model = Post fields = ['title', 'slug', 'body', 'status', 'category'] # 校验当前登录用户是否为帖子作者 def test_func(self): post = self.get_object() return self.request.user == post.author
内容的提问来源于stack exchange,提问作者sina mohsenifar
相关产品推荐
相关产品推荐

