42

明示的にリストせずに、すべてのフィールドを読み取り専用にしようとしています。

何かのようなもの:

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この時点では問題は設定されていません。

何か案は?

4

11 に答える 11

47

django 2.1以降、次のように'sメソッドFalseから戻ることで、表示を許可しながら編集を防ぐことができます。ModelAdminhas_change_permission

class CustomAdmin(admin.ModelAdmin):
    def has_change_permission(self, request, obj=None):
        return False

(これはdjango 2.1より前では機能しません。これは、表示のみを試みるすべてのユーザーへのアクセス許可も拒否するためです。)

于 2018-10-30T17:47:22.823 に答える
42

注意してください、self.model._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]
            ))
于 2012-12-11T23:17:36.037 に答える
25

さて、これがあります:

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

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

まだ醜い方法を探しています。

于 2012-12-11T10:13:51.293 に答える
12

モデルのメタフィールドを反復処理できます。

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
于 2012-12-11T10:10:44.210 に答える
5

インライン(タブまたはスタック)の場合

def get_readonly_fields(self, request, obj=None):
    fields = []
    for field in self.model._meta.get_all_field_names():
        if field != 'id':
            fields.append(field)
    return fields

def has_add_permission(self, request):
    return False
于 2015-02-03T08:33:06.333 に答える
4

これはDjango1.10でうまくいきました

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

    return list(set(
        [field.name for field in self.opts.local_fields] +
        [field.name for field in self.opts.local_many_to_many]
    ))
于 2017-03-18T17:21:11.897 に答える
3

それでも誰かがより良い方法を探している場合は、次のように使用できます。

@admin.register(ClassName)
class ClassNameAdmin(admin.ModelAdmin):
    readonly_fields = [field.name for field in ClassName._meta.fields]

ClassNameはModelクラスです。

于 2021-04-12T12:33:54.087 に答える
0

私の要件も同様でした。読み取り専用として表示するために必要なフィールドは1つだけです。そして、これはうまくいきました:

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 1
    fields = ['choice_text', 'votes']
    readonly_fields = ['votes']

class QuestionAdmin(admin.ModelAdmin):
    #fields = ['pub_date', 'question_text']
    fieldsets = [
        (None, {'fields': ['question_text']}),
        ('Date Information', {'fields': ['pub_date']}),
    ]
    search_fields = ['question_text']


    inlines = [ChoiceInline]

参照:C:\ Python27 \ Lib \ site-packages \ django \ contrib \ admin \ options.py

于 2018-02-27T11:40:46.620 に答える
0

user_modeを次のように定義したとします。

Admin, Customers and Staff

スタッフ(そしてもちろん顧客)を拒否したい場合は、顧客、製品、注文などを削除する特権...

あなたのコードは行きます;

def get_readonly_fields(self, request: HttpRequest, obj=None):
    if request.user.user_mode != "Admin":
        return self.readonly_fields + ['user_mode']
    return super().get_readonly_fields(request, obj)

ここで、user_mode=ユーザーのタイプを保持するモデルフィールド。

注意:私のコードは「Pylance」を使用しています(JSのtypescriptのように)

于 2021-05-26T08:07:53.970 に答える
-1

get_fieldsetsを使用すると、フォームからすべてのフィールドを取得できます

def get_readonly_fields(self, request, obj=None):
    readonly = []
    for fs in self.get_fieldsets(request, obj):
        if len(fs) > 1:
            readonly += fs[1].get('fields', [])
    return readonly
于 2013-10-11T12:37:54.857 に答える
-1
@admin.register(Hero)
class HeroAdmin(admin.ModelAdmin, ExportCsvMixin):
    ...
    readonly_fields = ["father", "mother", "spouse"]

参照: https ://books.agiliq.com/projects/django-admin-cookbook/en/latest/changeview_readonly.html

于 2020-03-14T08:33:23.860 に答える