Администратор Django readonly_fields: почему два разных пользователя видят одни и те же поля?Python

Программы на Python
Anonymous
Администратор Django readonly_fields: почему два разных пользователя видят одни и те же поля?

Сообщение Anonymous »

Я создал код, позволяющий различать две группы пользователей в администраторе Django, в результате чего все поля отображаются только для чтения или только некоторые из них, которые установлены непосредственно в классе ModelAdmin.

Сначала вот код:

Код: Выделить всё

class PersonAdmin(admin.ModelAdmin):
readonly_fields = ('created_at','created_by',)

def get_form(self, request, obj=None, **kwargs):
if obj:     # we are in edit mode
if request.user.is_superuser:
self.readonly_fields = ()
else:
for group in request.user.groups.all():
if str(group) == 'readonlyuser':
allfields = tuple(obj._meta.get_all_field_names())
self.readonly_fields = allfields

return super(PersonAdmin, self).get_form(request, obj, **kwargs)
Я разделяю данные по группам и соответствующим образом устанавливаю поля. Все работает нормально, если пользователи из двух групп не авторизованы одновременно! После того, как пользователь «только для чтения» вошел в систему, пользователь-администратор также получит все поля только для чтения.

Мои проверки также дали решение:
Если я добавлю дополнительный оператор if для пользователя-администратора в блок for, все будет работать как положено.

Код: Выделить всё

if str(group) == 'adminuser':
self.readonly_fields = PersonAdmin.readonly_fields
Почему это происходит и что там происходит?

У меня нет специальных настроек кэша, и это происходит на dev, а также на Apache с WSGI.

Насколько я понимаю, request.user.groups.all() должен возвращать все группы, в данный момент вошедшие в систему< /em> принадлежит пользователю. Откуда Django получает все поля (только для чтения), если другой пользователь с другим IP-адресом и сеансом соответствует этому блоку if?

Подробнее здесь: https://stackoverflow.com/questions/897 ... ame-fields

Вернуться в «Python»