Динамическое создание пользовательского разрешения для определенного имени поля модели в Django
Я создал модель и хочу создать некоторые группы и разрешения динамически с определенным именем поля модели и именем группы или именем кода разрешения.
Например, если у меня есть модель Institute с некоторыми полями (например, eiin, name, address, category), я хочу динамическое пользовательское разрешение под названием name_can_edit_address для поля name. Которое прекрасно работает (например-_can_edit_address) с классом Meta, но я не могу добавить имя поля модели как суффикс разрешения (например name_can_edit_address) в качестве кодового имени.
Возможно ли это сделать? Получается NameError: name 'self' is not defined.
# model specifications
class Institute(models.Model):
CATEGORY=(
('play', 'play'),
('High school', 'High school'),
('College', 'College'),
)
eiin = models.CharField(max_length=50, blank=True, null= True)
name = models.CharField(max_length=100)
address = models.ForeignKey(Address, on_delete=SET_NULL, blank=True, null=True)
category = models.CharField(max_length=100, choices=CATEGORY)
# dynamic group creation ok
# create group dynamically with the model objects
def save(self, *args, **kwargs):
super(Institute, self).save(*args, **kwargs)
Group.objects.create(name=str(self.name)+"_students")
Group.objects.create(name=str(self.name)+"_teachers")
Group.objects.create(name=str(self.name)+"_controller")
Group.objects.create(name=str(self.name)+"_employees")
Group.objects.create(name=str(self.name)+"_guardians")
# problem is here. It's not taking name field as suffix of code name for permissions
# create permissions dynamically with institution name & permission code like (field_permissioncode)
class Meta:
permissions = (
(str(self.name)+'_can_edit_address',
'can edit address of institute'),
(str(self.name)+'_can_add_eiin',
'can add eiin of institute')
)
В Django разрешения являются объектами, тогда у них есть выделенный класс: Permission
.
Но в Django разрешения связаны с ContentType
.
Если вы хотите создать какое-то разрешение "на лету", вам нужно создать contenttype и после разрешение следующим образом :
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Permission
def save(self, *args, **kwargs):
super(Institute, self).save(*args, **kwargs)
Group.objects.create(name=str(self.name)+"_students")
# ...
# Create contenttype and permissions, replace app_label and model to fit your needs
content_type = ContentType.objects.get(app_label='app_name', model='Institute')
permission = Permission.objects.create(codename=str(self.name)+'_can_edit_address',
name='can edit address of institute',
content_type=content_type)
permission = Permission.objects.create(codename=str(self.name)+'_can_add_eiin',
name='can edit eiin of institute',
content_type=content_type)
Вы можете найти больше объяснений в этом посте