在Django的管理界面中,有一个特定模型的表单,我希望以不同的方式呈现,具体取决于访问此表单的登录用户是普通用户还是管理员。除了一件巨大的事情之外,它正在寻找它:它变得混杂了。例如,管理员应该可以编辑的字段是只读的,在我之前就已经以“普通”用户身份登录。如果我在重新启动服务器后立即尝试完全相同的东西,工作正常,所有字段都是可编辑的。我想不知怎的,用户的会话混淆了。如何处理?
我有:
在App的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)
由于
答案 0 :(得分: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