1

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

我有管理网站,我可以从那里注册产品。在帐户中,我允许普通人注册和登录。

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

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

谢谢。

4

2 回答 2

1

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()
于 2012-06-05T10:50:17.510 回答
1

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

类公司(模型。模型):

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)

这很简单让我知道这是否是你想要的?

您也可以分配只读权限。在模型管理中

于 2012-06-05T06:59:15.750 回答