He creado un modelo y quiero crear algunos grupos y permisos dinámicamente con un nombre de campo específico del modelo y el nombre del grupo o el nombre del código de permiso.
Por ejemplo, si tengo un modelo de Instituto con algunos campos (por ejemplo, eiin , nombre , dirección , categoría ), quiero un permiso personalizado dinámico llamado nombre_puede_editar_dirección para el campo de nombre . Lo cual funciona bien (como _can_edit_address ) con la clase Meta, pero no puedo agregar el nombre de campo del modelo como sufijo del permiso (como name_can_edit_address ) como nombre de código.
¿Es posible hacer eso? Obtiene NameError: el nombre 'self' no está definido.
# 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') )Los permisos de Django son objetos , luego tienen una clase dedicada: Permission . Pero en Django, los permisos están vinculados a ContentType . Si desea crear algún permiso sobre la marcha, debe crear el tipo de contenido y después del permiso como este:
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)Puedes encontrar más explicaciones en este post .