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, чтобы проверить, был ли экземпляр создан впервые.