如何在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
相关产品推荐
相关产品推荐

