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
в этой точке не задана.
Любые идеи?
Ответы
Ответ 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