Подтвердить что ты не робот

Django admin - все поля прочитаны

Я пытаюсь сделать все поля readonly, не перечисляя их явно.

Что-то вроде:

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 в этой точке не задана.

Любые идеи?

4b9b3361

Ответ 1

Осторожные, 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]
            ))

Ответ 2

Хорошо, теперь это:

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

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

Ищите менее уродливый способ.

Ответ 3

Вы можете выполнять итерацию через мета-поля модели:

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

Ответ 4

Для строк (вкладка или стек)

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

def has_add_permission(self, request):
    return False

Ответ 5

Это сработало для меня с Django 1.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]
    ))

Ответ 6

С 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