在 Django 管理中使用 Django 站点框架



我第一次使用 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

最新更新