1

アプリケーションにメニュー (django-console メニュー) があり、その要素へのアクセスを制限したい (モデルも表示しない) のですが、通常のユーザーにはレポートを作成します。ユーザーがsuperuserすべてを表示できる場合 (ユーザー、インベントリ ... を参照settings.py)。これどうやってするの ?

# admin.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モデルを使用して、メニュー エントリごとに 1 つのカスタム アクセス許可を作成することもできます。

  • menu.users
  • menu.在庫
  • メニュー.ブログ
  • menu.レポート

したがって、ユーザーが表示する権限を持っているメニュー エントリを確認するには、次のようにする必要があります。

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

アクセス許可モデルのリファレンス ドキュメントは次のとおりです。

最後に、メニュー エントリをデータベースに移動し、 django-guardiandjango-object-permissionsなどの優れたアプリを使用して、そのメニュー エントリ インスタンスの一部に対する権限を各ユーザーに与えることができると思います。

于 2015-11-11T17:33:06.007 に答える