Django 관리자의 두 사용자 그룹을 구별하기 위해 코드를 생성하여 모든 필드를 읽기 전용으로 표시하거나 일부만 ModelAdmin 클래스에 직접 설정하도록했습니다.django admin readonly_fields 이해하기
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)
I는 그룹간에 나누어 따라 필드를 설정 여기 우선
코드이다. 두 그룹의 사용자가 동시에 로그인하지 않으면 모든 것이 잘 작동합니다! '읽기 전용'사용자가 로그인 한 후 adminuser는 모든 필드를 읽기 전용으로 설정합니다.
내 검사는 또한 솔루션을 제공 : 을 블록에 대한 모든 것을 내에서 관리 사용자에 대한 문이 기대 작품으로 만약 내가 추가를 넣어합니다.
if str(group) == 'adminuser':
self.readonly_fields = PersonAdmin.readonly_fields
왜 그런가요?
나는 특별한 캐시 설정이 없으며 WSGI가있는 Apache뿐만 아니라 dev 서버에서도 발생합니다.
내 이해 request.user.groups.all() 모든 그룹을 반환해야합니다 현재 사용자가 속한. Django는 allfields (readonly)를 어디에서 가져 왔으며, 다른 IP 및 세션의 다른 사용자가이 블록과 일치하면 어디에서 왔습니까?
감사합니다. 설명대로 작동합니다. 나는 이미 get_readonly_fields를 사용했지만,이 목적으로 사용하지 않기 위해서는 장님이되어야합니다. – normic
이 예는 obj 인수를 통해 전달되지 않지만 항상 None으로 설정됩니다. 다음과 같아야합니다 : super (MyModelAdmin, self) .get_readonly_fields (request, obj) – seddonym
@seddonym : good catch. 이제 해결되었습니다. 한 사람이 알아 차릴 때까지 1 년 반이 걸렸습니다.) –