我有一个 Django 应用程序,并且项目中有两个应用程序:帐户和商店。在我的商店应用程序中,我有产品、类别模型和其他模型。
我有管理网站,我可以从那里注册产品。在帐户中,我允许普通人注册和登录。
现在,我也希望用户能够注册产品,这样他们就可以销售自己的产品。但是,我不想让他们完全访问管理站点。
如何向一般用户授予对管理站点的有限访问权限?
谢谢。
我有一个 Django 应用程序,并且项目中有两个应用程序:帐户和商店。在我的商店应用程序中,我有产品、类别模型和其他模型。
我有管理网站,我可以从那里注册产品。在帐户中,我允许普通人注册和登录。
现在,我也希望用户能够注册产品,这样他们就可以销售自己的产品。但是,我不想让他们完全访问管理站点。
如何向一般用户授予对管理站点的有限访问权限?
谢谢。
ModelAdmin
正如您可能已经知道的那样,管理员使用一个类来呈现页面。正如 sharafjaffri 所建议的那样,该类有一个queryset
方法,您可以根据谁正在访问该站点,使用新过滤器覆盖该方法。
但仅靠过滤是不够的。您还需要将下拉列表中显示的值过滤为仅由用户创建的值。然后在保存时,您应该将新对象与添加它的用户的门户相关联。
这是我未经测试的快速实现:
class PortalAdmin(admin.ModelAdmin):
exclude = ('portal',)
def queryset(self, request):
"""
Filter the objects displayed in the change_list to only
display those for the currently signed in user.
"""
qs = super(UserAdmin, self).queryset(request)
if request.user.is_superuser:
return qs
else:
return qs.filter(portal=request.user.profile.portal)
def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
the_model = db_field.related.parent_model
if hasattr(the_model,'portal'):
kwargs['queryset'] = the_model.objects.filter(portal=request.portal)
return super(PortalAdmin,self).formfield_for_foreignkey(db_field, request, **kwargs)
def save_model(self, request, obj, form, change):
if not change:
obj.portal = request.portal
obj.save()
在管理员中,您可以创建组并分配对您想要的模型的访问权限,并且可以将相同的权限应用于用户,但您可能对对登录用户自己添加的模型记录的有限访问感兴趣。为了实现这一点,您必须将模型中的一列定义为用户的外键,如下所示我为公司定义了模型并将每个公司分配给用户:
类公司(模型。模型):
name = models.CharField(max_length=64, primary_key=True)
kam = models.ForeignKey(User, verbose_name='KAM', blank=True, null=True)
address = models.TextField(blank=True, null=True)
city = models.CharField(max_length=32, blank=True, null=True)
country = models.CharField(max_length=32, blank=True, null=True)
phone = models.CharField(max_length=32, blank=True, null=True)
fax = models.CharField(max_length=32, blank=True, null=True)
url = models.URLField(blank=True, null=True)
class Meta:
verbose_name_plural = 'Companies'
#unique_together = (('name', 'kam'),).
def __unicode__(self):
return self.name
现在您的模型将与用户相关联,现在您可以在 modeladmin 定义中使用 admin.py 限制要根据登录用户加载的记录,如下所示:
def queryset(self, request):
qs = super(CompanyAdmin, self).queryset(request)
# If super-user, show all comments
if request.user.is_superuser:
return qs
return qs.filter(kam=request.user)
这很简单让我知道这是否是你想要的?
您也可以分配只读权限。在模型管理中