【问题标题】:Django group permissions for specific model特定模型的 Django 组权限
【发布时间】:2019-05-03 14:52:53
【问题描述】:

我正在为我的邻居创建一个网站,我几乎已经完成了。但他又添加了一个我似乎无法完全理解建筑的功能。该功能本身非常简单,我已经编写好了。他只是想要一个有相册的照片库。他网站上的每个供应商都有自己的相册。

但我遇到的问题是,他希望每个供应商的特定用户能够访问这些专辑的 CRUD,而不是其他任何东西。如果我尝试在 django admin 中执行此操作,则用户可以访问不属于他们的其他专辑。所以我需要创建一些权限。我可以在 django 中使用组权限来执行此操作吗,因为 django 中的权限非常通用,并不特定于他们的供应商名称或任何其他模型。我只希望他们能够以他们的供应商名称访问和添加新项目。还是我需要使用其他工具,并创建另一个视图?

Models.py 供参考:

class Vendor(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(max_length=200, unique=True, null=True)
    website = models.CharField(max_length=256)
    city = models.CharField(max_length=100)
    state = models.CharField(max_length=3)
    vendor_email = models.CharField(max_length=100)
    images = models.ImageField(upload_to='vendor_images', blank='img/92-thumb.jpg')
    description = models.TextField()

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        # just check if product_model or vendor.name has changed
        self.slug = slugify(self.name)
        super(Vendor, self).save(*args, **kwargs)

class VendorAlbum(models.Model):
    vendor = models.ForeignKey(Vendor, on_delete=models.PROTECT, related_name='vendor')
    title = models.CharField(max_length=70)
    description = models.TextField(max_length=1024)
    thumb = ProcessedImageField(upload_to='albums', processors=[ResizeToFit(800)], format='JPEG',
                                options={'quality': 90})
    tags = models.CharField(max_length=250)
    is_visible = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now_add=True)
    slug = models.SlugField(max_length=50, unique=True)

    def __str__(self):
        return self.title


class VendorAlbumImage(models.Model):
    image = ProcessedImageField(upload_to='albums', processors=[ResizeToFit(1920)], format='JPEG',
                                options={'quality': 70})
    thumb = ProcessedImageField(upload_to='albums', processors=[ResizeToFit(800)], format='JPEG',
                                options={'quality': 80})
    album = models.ForeignKey(VendorAlbum, on_delete=models.PROTECT)
    alt = models.CharField(max_length=255, default=uuid.uuid4)
    created = models.DateTimeField(auto_now_add=True)
    width = models.IntegerField(default=0)
    height = models.IntegerField(default=0)
    slug = models.SlugField(max_length=70, default=uuid.uuid4, editable=False)

    def __str__(self):
        return self.alt

【问题讨论】:

    标签: django django-models django-permissions


    【解决方案1】:

    当您使用动态项目(例如专辑)时,您最好在视图中仅过滤与特定供应商相关的专辑,然后再将其显示在 crud 模板中,它将使用 Django 权限,而是从意见。

    【讨论】:

    • 感谢并理解。这是最有效的方法吗?我的问题是,它本质上是一个自配置门户。所以我需要让他们尽可能容易。而且我不会在网站建成后维护它。不过我会进一步调查。
    • 好吧...我想我现在明白了。将组添加到相册模型。并且当添加供应商时,覆盖保存并添加具有供应商名称的 django 组。然后在相册的 CRUD 视图上,有一个模板上下文来检查经过身份验证的用户是否是该组的成员。既然这是一个构建,那么忘记我不希望超级管理员不得不担心内部事情。这也将使供应商能够将多人添加到他们的组中,因此他们可以拥有多个管理员。这是否符合您所提到的内容?
    • 这将是使用 Django 权限的方法,但您将保留这样一个事实,即每个供应商都可以更改所有相册,以便供应商只能管理它的相册,您可以按照我所说的继续操作你。解决您的需求是一种很好且有效的做法。如果对您有帮助,请记住检查答案是否正确,以便它可以帮助其他看起来相同的人。
    猜你喜欢
    • 2019-09-15
    • 2011-05-03
    • 2016-07-31
    • 1970-01-01
    • 2023-04-11
    • 2021-02-10
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多