2011-07-31 5 views
1

Djangoの管理インターフェースには、このフォームにアクセスするログインユーザーが通常のユーザーか管理者かによって、異なる方法でレンダリングしたい特定のモデルのフォームがあります。 1つの巨大なものを除いて見つけることができます:それは混在します。たとえば、管理者が編集可能にするフィールドは、「通常」のユーザーとしてログインする直前に読み取り専用です。サーバを再起動した直後にまったく同じことを試しても、うまく動作し、すべてのフィールドが編集可能です。私は何とかユーザーのセッションが混ざり合っていると思います。これをどう扱う?アプリケーションの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

問題はあなたのソリューションは、スレッドセーフではないということである。ここ

は、私が持っているWAHTです。 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はadminクラスに多くのフックを提供しており、ドキュメント(https://docs.djangoproject.com/en/dev/ref/contrib/admin/)を参照してください。また、ソースコードを見てみると、非常に便利です。 –

関連する問題