2012-01-23 4 views
3

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 및 세션의 다른 사용자가이 블록과 일치하면 어디에서 왔습니까?

답변

12

ModelAdmin은받은 모든 요청에 ​​대해 한 번만 인스턴스화됩니다. 그래서 읽기 전용 필드를 정의하면 보드 전체에 영구히 설정됩니다. 당신이 장고 1.2+를 실행으로

는 한, 당신이 바로이 목적을 위해 대신 사용할 수있는 get_readonly_fields 방법있다 :

class MyModelAdmin(admin.ModelAdmin): 
    ... 

    def get_readonly_fields(self, request, obj=None): 
     if request.user.is_superuser: 
      return super(MyModelAdmin, self).get_readonly_fields(request, obj) 
     else: 
      return ('created_at', 'created_by') 

ModelAdmin에서 readonly_fields 속성을 제거하거나 필드로 설정이해야 모두에게에 대한 읽기 전용입니다. 그런 다음 else 블록에서 비 슈퍼 유저에 대해서만 읽기 전용이어야하는 모든 필드를 지정하십시오.

+0

감사합니다. 설명대로 작동합니다. 나는 이미 get_readonly_fields를 사용했지만,이 목적으로 사용하지 않기 위해서는 장님이되어야합니다. – normic

+0

이 예는 obj 인수를 통해 전달되지 않지만 항상 None으로 설정됩니다. 다음과 같아야합니다 : super (MyModelAdmin, self) .get_readonly_fields (request, obj) – seddonym

+0

@seddonym : good catch. 이제 해결되었습니다. 한 사람이 알아 차릴 때까지 1 년 반이 걸렸습니다.) –

1

웹 서버를 처음 다시 시작한 후 Django Admin의 필드가 실행 (즉, 캐시 됨)되기 때문에. readonly_fields 튜플을 다시 선언하여이 문제를 해결할 수 있습니다. 이와 같이 (테스트되지 않음) :

def get_form(self, request, obj=None, **kwargs): 
    self.readonly_fields = ('created_at','created_by',) 
    # ...