我是第一次使用Django站点框架实现解决方案,并且不确定是否有更好的方法在Django管理员上实现它.
目前我有它在前端工作,但我希望用户被限制为仅管理属于“他们的”站点的后端上的内容(每个用户被分配到一个站点).
为了做到这一点,我通过指定Admin类中的相应字段来分割超级用户(is_superuser)和其他任何人可用的字段.我当时压倒了以下内容:
get_form方法根据用户返回不同的表单.例如,超级用户可以为任何站点创建内容,而任何其他用户只能为自己的站点创建内容.
def get_form(self, request, obj=None, **kwargs):
if request.user.is_superuser:
self.fieldsets = self.user_fieldsets + self.superuser_fieldsets
else:
self.fieldsets = self.user_fieldsets
return super(FaqCategoryAdmin, self).get_form(request, obj, **kwargs)
get_queryset方法,仅显示用户有权访问的站点的相关条目.
def get_queryset(self, request):
qs = super(FaqCategoryAdmin, self).get_queryset(request)
if request.user.is_superuser:
return qs
else:
return qs.filter(site=settings.SITE_ID)
save_model用于确保非超级用户是否保存新条目,默认为其网站:
def save_model(self, request, obj, form, change):
if not request.user.is_superuser:
obj.site = get_current_site(request)
obj.save()
考虑到使用站点框架来限制内容的前端显示(使用模型管理器)非常简单,这感觉非常繁琐.有没有更好的方法来解决这个问题?
谢谢!
最佳答案 就在这里.创建自己的自定义管理基类.从该那个派生所有其他管理类.
class MyAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if request.user.is_superuser:
self.fieldsets = self.user_fieldsets + self.superuser_fieldsets
else:
self.fieldsets = self.user_fieldsets
return super(MyAdmin, self).get_form(request, obj, **kwargs)
def get_queryset(self, request):
qs = super(MyAdmin, self).get_queryset(request)
if request.user.is_superuser:
return qs
else:
return qs.filter(site=settings.SITE_ID)
def save_model(self, request, obj, form, change):
if not request.user.is_superuser:
obj.site = get_current_site(request)
obj.save()
然后,
class FaqCategoryAdmin(MyAdmin):
# now this class is dry. Because repetitive code is in parent