【问题标题】:Django admin site for limited privilege users有限权限用户的 Django 管理站点
【发布时间】:2012-06-05 05:57:18
【问题描述】:

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

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

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

我怎样才能将这种有限的管理站点访问权限授予普通用户?

谢谢。

【问题讨论】:

  • 管理员并不是要取代您自己的网站;控制管理员登录的标志被称为 is_staff 是有原因的。
  • 您可以通过以超级用户身份登录来在管理员本身中为用户设置权限
  • 不要这样做。花时间为您的用户构建前端。管理员不是也永远不会用于一般用户操作。
  • 为什么所有的反对票。也许破解 django 管理站点不是解决这个特定问题的合适(或至少是理想的)解决方案,但它仍然是一个有效的问题......

标签: django django-admin


【解决方案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

现在您的模型将与用户相关联,现在您可以在 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)

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

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

【讨论】:

    【解决方案2】:

    Admin 使用类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()
    

    【讨论】:

      猜你喜欢
      • 2014-07-28
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 2016-01-30
      • 1970-01-01
      • 2015-06-26
      相关资源
      最近更新 更多