2011-07-31 58 views
1

在Django的管理界面中,有一種表單,我希望以不同的方式呈現特定模型,具體取決於訪問此表單的用戶是普通用戶還是管理員。除了一件巨大的事情之外,它正在發現:它變得混雜。例如,應該可以由管理員編輯的字段是隻讀的,在我之前已經以「普通」用戶身份登錄之後。如果我在重新啓動服務器後立即嘗試完全相同的事情,可以正常工作,並且所有字段都是可編輯的。我猜這個用戶的會話會混淆不清。如何處理這個?Django用戶會話混合。

這裏是啥子我:

在應用的admin.py:

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保持管理員實例,因此您設置爲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在管理類中提供了許多掛鉤,你可以在文檔中閱讀(https://docs.djangoproject.com/en/dev/ref/contrib/admin/)。我發現還非常有用的是查看源代碼:https://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py。 –