1

我的应用程序中有一个菜单(django-console 菜单),我想限制对其元素的访问(并且也不显示模型),但为普通用户提供报告。如果用户superuser让他查看所有内容(用户、库存...请参阅settings.py)。我怎样才能做到这一点 ?

# 管理员.py

...
class UserAdmin(admin.ModelAdmin):
    list_display = (
        'user',
    )


class PaymentAdmin(admin.ModelAdmin):
    list_display = (
        'user',
    )

    pass

...

admin.site.unregister(User)
admin.site.register(Message, MessageAdmin)
admin.site.register(Country, CountryAdmin)
admin.site.register(Payment, PaymentAdmin)
admin.site.register(Server, ServerAdmin)
admin.site.register(User, CustomUserAdmin)
admin.site.register(Package, PackageAdmin)
admin.site.register(PackageRoute, PackageRouteAdmin)

这是models.py的相关部分:

# models.py

...
class Message(models.Model):
    class Meta:
        app_label = 'myprox'

    date_created = models.DateTimeField(null=False, default=datetime.utcnow)
    title = models.CharField(max_length=256, null=False, blank=False, default="Message Title")
    content = models.TextField(null=False, blank=True, default="Message Content")
    has_url = models.BooleanField(default=False)
    is_sticky = models.BooleanField(default=False)
    is_persistent = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)
    is_generic = models.BooleanField(default=True)
    time_shown = models.IntegerField(default=1, null=True, blank=False)
    specific_to_plan = models.CharField(max_length=256, null=False, blank=True)
    url = models.CharField(max_length=256, null=True, blank=True)

    def __unicode__(self):
        return self.content

现在settings.py:

# settings.py

ADMIN_MENU = [
    {
        'name': 'Users',
        'models': [
            'User',
            'Message',
            'Payment',
        ],
        'icon': 'icon-user'
    },
    {
        'name': 'Inventory',
        'models': [
            'Country',
            'Server',
            'Package',
            'blog.post'
        ],
        'icon':'icon-user'
    },
    {
        'name': 'Blog',
        'models': [
            'Post',
        ],
        'icon':'icon-user'
    },
    {
        'name': 'Reports',
        'models': [
            ('Users', '/console/reports/users'),
            ('Usage', '/console/reports/usage'),
        ],
        'icon':'icon-user'
    }
]
4

1 回答 1

0

您应该考虑将您的重写ADMIN_MENU为:

[
    {
        'name': 'Users',
        'models': [
            'app1.User',
            'app2.Message',
            'app3.Payment',
        ],
        'icon': 'icon-user'
    },
    (...)
]

如果您使用<app label>.<model name>符号列出模型,那么您可以检查用户是否有权列出每个模型,然后您就会知道您是否让他看到每个菜单条目。

例如,为了知道用户是否my_user可以看到“用户”菜单条目,您应该根据文档检查此布尔语句:

my_user.has_perm('app1.list_user') and my_user.has_perm('app2.list_message') and my_user.has_perm('app3.list_payment')

这是一种方法。另一种方式,一种更简单的方式,可以使用auth.Permission模型来创建您的自定义权限,每个菜单条目一个:

  • 菜单用户
  • 菜单.库存
  • 菜单博客
  • 菜单报告

因此,为了检查用户有权查看哪些菜单条目,您必须执行以下操作:

if my_user.has_perm('menu.user'):
    # this user can see the Users menu entry
    pass

这是 Permission模型的参考文档。

最后,我认为也许您可以将菜单条目移动到您的数据库并使用一些不错的应用程序,例如django-guardiandjango-object-permissions来授予每个用户对某些菜单条目实例的权限

于 2015-11-11T17:33:06.007 回答