特定模型的 Django 组权限

Django group permissions for specific model

我正在为我的邻居开发一个网站,我几乎已经完成了。但是他又添加了一项我似乎无法全神贯注的功能。这个功能本身很简单,我已经写好了。他只是想要一个有相册的照片库。他网站上的每个供应商都会有自己的相册。

但我遇到的问题是他希望每个供应商的特定用户能够访问这些专辑的 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

当您使用相册等动态项目时,您最好在视图中过滤与特定供应商相关的相册,然后再在 CRUD 模板中显示它,它不会使用 Django 权限,而是从视图中控制。