Django Assign-Perm с сигналом после сохранения

У меня есть модель Django по имени archive это связано с group (Django Auth) по внешнему ключу. Чтобы пользователь мог что-то редактировать в этом архиве, он должен иметь разрешение сделать это через django-guardian, Я могу связать архив с группой, как показано в моем коде ниже, однако мне нужно иметь возможность устанавливать разрешения для каждого объекта (архива) для каждой группы. Я пытаюсь сделать это с помощью post_save или же post_delete сигнал (чтобы должным образом предотвратить сиротские разрешения).

Другими словами, вот шаги, которые я хочу выполнить. Посетите страницу администратора. Создать / Редактировать экземпляр Archive, Укажите на этой странице, какая группа пользователей будет связана с этим конкретным Archive. После сохранения этого экземпляра Django должен автоматически аутентифицировать указанную группу с правами "чтения" для этого экземпляра архива.

Какой файл я буду хранить Archive_post_save_handler в? models.py? В настоящее время я не могу назначать групповые разрешения, потому что думаю, что у меня проблемы с передачей объектов через мои функции. Как я могу сделать это? В качестве дополнительного вопроса, будет ли применяться этот хук, если я редактировал модель через оболочку?

models.py

from django.db import models
from django.contrib.auth.models import Group
from django.db.models.signals import *
from django.dispatch import receiver

class Archive(models.Model):
    name = models.CharField(max_length = 30)
    nickname = models.CharField(max_length = 30, blank=True)
    Group = models.ForeignKey(Group, blank=True, null=True, help_text='A group of users that are allowed access to the archive. This should typically be called the same thing as the archive name.')

    class Meta:
        permissions = (
            ('read', 'Read Archive'),
        )

    def __unicode__(self):
        return self.name

@receiver(post_save, sender=Archive)
def Archive_post_save_handler(sender, instance, **kwarks):
    group = Group.objects.get(name=instance.Group)
    assign_perm('read', group, instance) #what I primarily want to accomplish in this question is on this line

1 ответ

Решение

Я думаю, что код, который вы вставили сюда, вызовет рекурсивный вызов Archive_post_save_handlerпотому что последняя строка кода также вызовет другую post_save сигнал. Вы должны получить created аргумент из kwargs, чтобы проверить, был ли экземпляр создан впервые.

Другие вопросы по тегам