django 使用没有模型的权限

to94eoyn  于 2023-03-04  发布在  Go
关注(0)|答案(1)|浏览(128)

我有一个没有模型的django设置,但是我想使用认证/权限系统来限制对某些视图的访问。为此,我创建了一个空模型:

from django.db import models

# Create your models here.
class Report(models.Model):
    class Meta:
        permissions = (
            ('view', "May view the reports")
        )

并将该权限添加到我的视图中:

@login_required
@permission_required('report.view')
def index(request):
     ...

当以staff用户身份登录时,它可以正常工作,当以普通用户身份登录时,我看到了登录屏幕。但是,在我的管理面板中,我看不到权限,所以我不能给予普通用户查看报告的权限。我尝试运行makemigrations,但它说没有检测到任何更改。
我如何使用一个空模型来获得权限?

u5rb5r59

u5rb5r591#

不需要迁移,您需要做的是创建正确的ContentType条目,这是Permission模型所需的字段。
一旦你这样做:

from django.contrib.contenttypes.models import ContentType

ContentType.objects.get_for_model(Report)

...在幕后执行get_or_create,然后在添加权限时,您将看到对应的条目report作为内容类型。
顺便说一句,如果你只是为了获得权限而使用它,你也可以将abstract = True添加到你的报表模型的Meta中,这样它就不会为它创建一个数据库表。如果你这样做,你必须传递关键字参数for_concrete_model。下面是一个示例代码:

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.db import models

# This is an abstract model that exists only so that we can create a ContentType
# for which can attach permissions to it.
# There is no database table created for it
class CustomPermissions(models.Model):
    class Meta:
        abstract = True

def sync_custom_permissions():
    content_type = ContentType.objects.get_for_model(
                                        CustomPermissions,
                                        for_concrete_model=False)

    permissions = [
        ("can_eat_pizza", "Can Eat Pizza"),
        ("can_deliver_pizza", "Can Deliver Pizza"),
        ("can_view_feature_flags", "Can View Feature Flags"),
        ("can_update_feature_flags", "Can Update Feature Flags"),
    ]

    for codename, name in permissions:
        Permission.objects.get_or_create(name=name,
                                         codename=codename,
                                         content_type=content_type)

相关问题