Разрешения группы Django для конкретной модели - PullRequest
1 голос
/ 03 мая 2019

Я работаю над сайтом для моего соседа, и я почти полностью закончил. Но он добавил еще одну особенность, которую я не могу обернуть вокруг здания. Функция сама по себе довольно проста, и я уже написал ее. Он просто хотел фотогалерею с альбомами. У каждого продавца на его сайте будет свой собственный альбом.

Но проблема, с которой я сталкиваюсь, заключается в том, что он хочет, чтобы конкретные пользователи каждого поставщика имели доступ к 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 голосов
/ 03 мая 2019

Поскольку вы используете динамический элемент, такой как альбомы, вам лучше отфильтровать в представлениях только альбомы, относящиеся к конкретному поставщику, прежде чем показывать его в шаблонах crud, он будет использовать разрешения Django, но вместо этого управлять из взгляды.

...