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

如何在Wagtail的admin后台为非页面模型存储user_id

Wagtail ModelAdmin 自动存储当前登录用户ID的解决方案

Wagtail的ModelAdmin没有save_model()方法,但可以通过重写save_instance()方法实现自动注入当前登录用户的ID,无需手动在表单中填写用户字段,具体实现步骤如下:

步骤1:调整模型字段(可选优化)

你当前的Info模型中user字段设置了null=True,由于我们会在保存时自动赋值,建议去掉该参数避免空值:

from django.db import models
from wagtail.models import Orderable

class Info(Orderable):
    user = models.ForeignKey(
        'auth.User', 
        on_delete=models.CASCADE,
        blank=False,
        related_name='+',
    )

步骤2:重写ModelAdmin的保存逻辑

在你的ModelAdmin定义中,先把user字段从表单中排除,再重写save_instance方法自动赋值当前用户:

from wagtail.contrib.modeladmin.options import ModelAdmin
from .models import Info

class InfoAdmin(ModelAdmin):
    model = Info
    # 隐藏user字段,不让用户在表单中手动选择
    exclude_from_form = ['user']

    def save_instance(self, request, instance, form, change):
        # change为False代表是新增实例,此时赋值当前登录用户
        if not change:
            instance.user = request.user
        # 调用父类原生保存逻辑
        return super().save_instance(request, instance, form, change)
    
    # 可选:实现不同用户仅查询自己的数据
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        # 超级管理员可查看所有数据
        if request.user.is_superuser:
            return qs
        # 普通用户仅查看自己创建的数据
        return qs.filter(user=request.user)

低版本Wagtail兼容方案

如果你使用的Wagtail版本不支持exclude_from_form参数,可以通过重写get_form方法移除用户字段:

def get_form(self, request, obj=None, **kwargs):
    form = super().get_form(request, obj, **kwargs)
    # 移除表单中的user字段
    if 'user' in form.base_fields:
        del form.base_fields['user']
    return form

内容的提问来源于stack exchange,提问作者Karl Jhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:45:03