Django admin-将所有字段设置为只读

2024-05-17 23:07:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使所有字段都只读而不显式地列出它们。

类似于:

class CustomAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            return self.readonly_fields

        return self.fields

问题是CustomAdmin.fields此时未设置。

有什么想法吗?


Tags: selfnoneobjfieldsgetreturnifadmin
3条回答

好吧,现在是这样:

class CustomAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        # ...

        return [f.name for f in self.model._meta.fields]

仍然在寻找一种不那么丑陋的方式。

小心,self.model.\u meta.fields不一定是CustomAdmin拥有的字段!

“管理的所有字段”看起来更像这样:

from django.contrib import admin
from django.contrib.admin.utils import flatten_fieldsets

class CustomAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            return self.readonly_fields

        if self.declared_fieldsets:
            return flatten_fieldsets(self.declared_fieldsets)
        else:
            return list(set(
                [field.name for field in self.opts.local_fields] +
                [field.name for field in self.opts.local_many_to_many]
            ))

您可以遍历模型元字段:

def get_readonly_fields(self, request, obj=None):
    if obj:
        self.readonly_fields = [field.name for field in obj.__class__._meta.fields]
    return self.readonly_fields

相关问题 更多 >