You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:27:03