我有一个Django应用程序,在项目中有两个应用程序:帐户和商店。在我的商店应用程序中,我有产品,类别模型和其他模型。
我有管理网站,我可以在那里注册产品。在帐户中,我允许一般人注册并登录。
现在,我还希望用户能够注册产品,以便他们可以销售自己的产品。但是,我不想让他们完全访问管理站点。
如何向一般用户提供对管理站点的有限访问权限?
感谢。
答案 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()