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

Django Admin创建Post时Author字段仅显示当前用户的实现方法

解决方案

要实现非超级用户作者在后台添加Post时,Author字段仅显示当前登录用户的需求,你可以通过重写Django Admin的几个核心方法完成,具体实现如下:

1. 替换admin.py中的PostAdmin类

将原有的PostAdmin代码替换为以下内容:

from django.contrib import admin
from .models import Post

class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'slug', 'status','created_on')
    list_filter = ("status",)
    search_fields = ['title', 'content']
    prepopulated_fields = {'slug': ('title',)}

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(author=request.user)

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        # 限制非超级用户的Author字段可选范围仅为当前用户
        if db_field.name == "author" and not request.user.is_superuser:
            kwargs["queryset"] = request.user._meta.model.objects.filter(id=request.user.id)
        return super().formfield_for_foreignkey(db_field, request, **kwargs)

    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        # 新建Post时自动填充当前用户为作者
        if not obj and not request.user.is_superuser:
            form.base_fields['author'].initial = request.user
        return form

    def get_readonly_fields(self, request, obj=None):
        # 非超级用户无法修改作者字段
        readonly_fields = super().get_readonly_fields(request, obj)
        if not request.user.is_superuser:
            return readonly_fields + ('author',)
        return readonly_fields

2. 代码功能说明

  • formfield_for_foreignkey:针对author外键字段,当登录用户不是超级用户时,将可选的用户列表过滤为仅当前登录用户,添加Post时下拉框只会显示自己。
  • get_form:在创建新Post(无现有对象obj=None)且用户非超级用户时,自动将author字段的初始值设置为当前登录用户,无需手动选择。
  • get_readonly_fields:让非超级用户在添加或修改Post时,author字段变为只读状态,防止意外修改作者信息。
  • 保留原有get_queryset:维持非超级用户仅能查看自己创建的Post的逻辑。

内容的提问来源于stack exchange,提问作者Abdul Rehman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:22:54