用于有限特权用户的Django管理站点

时间:2012-06-05 05:57:19

标签: django django-admin

我有一个Django应用程序,在项目中有两个应用程序:帐户和商店。在我的商店应用程序中,我有产品,类别模型和其他模型。

我有管理网站,我可以在那里注册产品。在帐户中,我允许一般人注册并登录。

现在,我还希望用户能够注册产品,以便他们可以销售自己的产品。但是,我不想让他们完全访问管理站点。

如何向一般用户提供对管理站点的有限访问权限?

感谢。

2 个答案:

答案 0 :(得分:1)

在管理员中,您可以创建组并分配对所需模型的访问权限,同样可以应用于用户,但您可能对对已记录用户自己添加的模型记录的有限访问感兴趣。为了实现这一点,你必须在模型中为一个用户的外键定义一列,如下所示我为公司定义了模型,并将每个公司分配给用户:

类公司(models.Model):

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

现在您的模型将与用户相关联,现在您可以根据已记录的用户使用admin.py在modeladmin定义中限制要加载的记录,如下所示:

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)

如果这是你想要的那么简单的让我知道吗?

您也可以分配只读权限。在模特管理员

答案 1 :(得分:1)

管理员使用类ModelAdmin来呈现您可能已经知道的页面。该类有一个queryset方法,根据sharafjaffri的建议,根据访问该网站的用户,使用新的过滤器覆盖该方法。

但仅靠过滤是不够的。您还需要将下拉列表中显示的值过滤到仅由用户创建的值。然后在保存时,您应该将新对象与添加它的用户的门户相关联。

这是我快速未经测试的相同实现:

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()