2011-07-31 3 views
1

Django의 관리 인터페이스에는이 양식에 액세스하는 기록 된 사용자가 일반 사용자 또는 관리자인지 여부에 따라 다른 방식으로 렌더링하려는 특정 모델의 양식이 있습니다. 그것은 하나의 거대한 것을 제외하고는 작동합니다 : 그것은 혼합됩니다. 예를 들어, 관리자가 편집 할 수있는 필드는 "일반"사용자로 로그인하기 직전에 읽기 전용입니다. 서버를 다시 시작한 후 바로 똑같은 작업을 시도해도 제대로 작동하고 모든 필드를 편집 할 수 있습니다. 나는 어쨌든 사용자의 세션이 혼란 스러울 것이라고 생각합니다. 어떻게 처리할까요? 앱의 admin.py에서Django 사용자 세션이 혼합되었습니다.

:

151 class AdminForm(ModelForm): 
152  class Meta: 
153   model = PromotionalSlot 
154   exclude = ['deal'] 
155 
156 class NormalUserForm(ModelForm): 
157  class Meta: 
158   model = PromotionalSlot 
159   exclude = ['site'] 
160   
161 class PromotionalSlotAdmin(admin.ModelAdmin): 
162  def get_form(self, request, obj=None, **kwargs): 
163   if request.user.is_superuser: 
164    return AdminForm 
165   else: 
166    self.readonly_fields = ['start_date','end_date','level','city','status'] 
167    return NormalUserForm· 
168 
169 admin.site.register(models.PromotionalSlot, PromotionalSlotAdmin) 

감사

답변

2

문제는 솔루션이 스레드로부터 안전하지 않습니다 것입니다 여기에

내가 가진 원하든입니다. Django는 admin 인스턴스를 유지하므로 self.readonly_fields으로 설정된 값은 스레드의 모든 후속 요청에도 사용됩니다.

정말 멋지다
class PromotionalSlotAdmin(admin.ModelAdmin): 

    def get_readonly_fields(self, request, obj=None): 
     if request.user.is_superuser: 
      return [] 
     else: 
      return ['start_date', 'end_date', 'level', 'city', 'status'] 

    def get_form(self, request, obj=None, **kwargs): 
     if request.user.is_superuser: 
      return AdminForm 
     else: 
      return NormalUserForm 
+0

가 ... 난 내가 list_display','exclude' 또는'list_filter '으로, 예를 들어, 동일한 일을 할 수 있다고 생각 : 이것은 당신이 스레드 안전 할 수있는 방법입니다 '맞지? – Rodrogo

+0

Django는 admin 클래스에 많은 후크를 제공하며 문서 (https://docs.djangoproject.com/en/dev/ref/contrib/admin/)에서 해당 내용을 읽을 수 있습니다. 또한 매우 유용한 것은 소스 코드 (https://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py)를 살펴 보는 것입니다. –

관련 문제