特定模型的Django组权限

时间:2019-05-03 14:52:53

标签: django django-models django-permissions

我正在为我的邻居制作一个网站,而我几乎完成了。但是他又增加了一个功能,我似乎无法全神贯注于构建。该功能本身非常简单,我已经编写了它。他只是想要一个带相册的照相馆。他网站上的每个供应商都会有自己的相册。

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

1 个答案:

答案 0 :(得分:0)

当您使用动态项目(例如相册)时,最好在视图中仅过滤与特定供应商相关的相册,然后再将其显示在Crud模板中,它将使用Django权限,但可以通过Django权限进行控制视图。