Я создал некоторый код, чтобы различать две группы пользователей в админке 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 для администратора в пределах для блока все работает как положено.
if str(group) == 'adminuser':
self.readonly_fields = PersonAdmin.readonly_fields
Почему это происходит и что там происходит?
У меня нет специальных настроек кэша, и это происходит на сервере dev кактакже как и на Apache с WSGI.
Насколько я понимаю, request.user.groups.all () должен возвращать все группы, к которым в данный момент принадлежит пользователь, к которому принадлежит .Откуда Django получает все поля (только для чтения), если другой пользователь с другим IP-адресом и сессией соответствует этому блоку if?