2017-01-12 9 views
1

Теперь у меня есть models.py как этотСоздания пользовательских разрешений в Джанго модели

class FileCategory(models.Model): 
    file_type = models.CharField(_('type'), max_length=128) 

    def __unicode__(self): 
     return self.file_type 


class Doc(models.Model): 
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, 
     on_delete=models.CASCADE) 
    file_category = models.ForeignKey('FileCategory', null=True) 
    file = models.FileField(upload_to='documents/', 
          null=True, blank=True) 

    class Meta: 
     permissions = (("upload_file", "upload file"), 
         ("delete_file", "delete file"), 
         ("download_file", "download file"), 
         ("access_file", "access file"), 
         ) 

Теперь я хочу, чтобы добавить разрешения для каждого FileCategory таблицы Например если у меня есть filecategory NUMm, манекен и Суммы Я хочу автоматически имеет разрешение ("access_file_numm","access_file_summ","access_file_dumm",)

Я попытался сделать решение, как это:

permissions = (bla,bla,bla, 
        )+\ 
        ("access_file_%s" (type.__str__() for type in FileCategory.objects.all()), 
        "access %s"(type.__str__() for type in FileCategory.objects.all())) 

И, конечно, я хочу, чтобы перенести их в базу данных

Решение:

в Moemn ответов с редактированием:

def save(self, *args, **kwargs): 
    super(FileCategory, self).save(*args, **kwargs) 

    Permission.objects.get_or_create(content_type=ContentType.objects.get_for_model(Doc), 
           codename="access_type_%s" % self.file_type, 
           name="access type %s" % self.file_type) 

ответ

1

Вы можете сделать это путем создания Permission динамически после каждого FileCategory создания.

например.

def save(self, *args, **kwargs): 
    super(FileCategory, self).save(*args, **kwargs) 
    Permission.objects.create(content_type=ContentType.get_for_model(Doc), name="access_file_%s" % self.file_type) 
    Permission.objects.create(content_type=ContentType.get_for_model(Doc), name="access_%s" % self.file_type) 

Или вы можете использовать сигналы, та же идея.

+0

Большое спасибо @ Mo'men Это сработало, и я обновил вопрос с вашего ответа (отредактирован) –