2015-07-23 2 views
3

Я пытался создать настраиваемое разрешение при переносе, однако после запуска миграции разрешение не было создано в таблице разрешений. Может ли кто-нибудь указать, что такое ошибка? Также я не уверен, что я должен использовать в качестве связанной модели для ContentType, поскольку разрешение используется для ограничения пользователей, которые могут просматривать страницу, на которой отображается сводка пользователей на сайте. Любая помощь будет принята с благодарностью, спасибо.Создание пользовательских разрешений при миграции данных

def add_view_aggregated_data_permissions(apps, schema_editor): 
    ContentType = apps.get_model('django', 'ContentType') 
    Permission = apps.get_model('auth', 'Permission') 
    content_type = ContentType.objects.get(app_label='auth', model='user') 
    permission = Permission.objects.create(codename='can_view_data', 
              name='Can view data', 
              content_type=content_type) 
+0

Почему вы хотите создать разрешение таким образом? – Wtower

+0

Это неправильный способ сделать это? Я хочу создать разрешение для представления, как мне это сделать? – Aithusa

ответ

1

Я бы порекомендовал вам использовать стандартный способ использовать пользовательские разрешения, как описано в Django documentation. Вы избежите многих проблем.

Чтобы создать пользовательские разрешения для данного объекта модели, используйте атрибут метаданных разрешений.

В этом примере модель создает пользовательское разрешения:

class MyModel(models.Model): 
    ... 
    class Meta: 
     permissions = (
      ('view_data', "Can see available data"), 
     ) 

Единственное, это делает создать эти дополнительные разрешения при запуске manage.py migrate. Ваш код отвечает за проверки значения этих разрешений, когда пользователь пытается получить доступ к функциональности, предоставляемой приложением ...

Затем вы можете использовать permission_required декоратора с целью проверки наличия специального разрешения :

from django.contrib.auth.decorators import permission_required 

@permission_required('myapp.view_data') 
def my_view(request): 
    ... 
+0

Означает ли это, что разрешение будет связано с моделью пользователя? Часть, в которой я была смущена, заключается в том, что мое разрешение используется только для ограничения доступа к представлению, поэтому я не уверен, с какой моделью это связано. Кроме того, смогу ли я добавить это разрешение пользователям на сайт администратора? Edit: Только что понял, что я не могу редактировать код в модели User, поэтому, где я должен поставить мета-код? Я новичок в этом, поэтому у меня может быть много вопросов ... – Aithusa

+0

Что значит, что разрешение будет связано с моделью пользователя? Все разрешения связаны с моделью пользователя по существу. Если вам необходимо добавить разрешение, например, для просмотра пользователей, то это совсем другое дело, и вам нужно будет расширить или переопределить модель User. Я полагаю, что ваше представление * будет * отображать данные по крайней мере из некоторой модели, поэтому вы можете добавить разрешение на эту модель. – Wtower

+0

О, я думал, что ассоциация была чем-то вроде того, что связано с разрешением, на которое модель сможет получить это разрешение, но на самом деле это не имеет смысла, я думаю, именно поэтому я запутался. Спасибо за разъяснение :) Итак, если представление содержит данные из разных моделей, мне нужно только добавить разрешение на одну модель? – Aithusa

0

Что касается django 1.8 и встроенных миграций, это очень безболезненно.

  1. Все, что вам нужно сделать, это добавить нужные разрешения для соответствующей модели
  2. Run makemigration

    ./manage.py makemigrations

  3. Запустите миграции создается на этапе выше

    ./manage.py migrate

0

Я хотел создать пользовательское разрешение (чтение) для всех моделей приложений. Я сделал это два шага:

  1. Создание расширенного разрешения DjangoModelPermissions:

    class DjangoModelPermissionsExtended(DjangoModelPermissions): 
        """ 
        """ 
        perms_map = { 
         'GET': ['%(app_label)s.read_%(model_name)s'], 
         'OPTIONS': [], 
         'HEAD': [], 
         'POST': ['%(app_label)s.add_%(model_name)s'], 
         'PUT': ['%(app_label)s.change_%(model_name)s'], 
         'PATCH': ['%(app_label)s.change_%(model_name)s'], 
         'DELETE': ['%(app_label)s.delete_%(model_name)s'], 
        } 
    
  2. Положите его в каждый вид я хочу иметь разрешение на чтение:

    class ExampleViewSet(viewsets.ModelViewSet): 
        permission_classes = (
         DjangoModelPermissionsExtended, 
        ) 
    
  3. Создайте собственный шаблон django command.ру:

    from django.core.management.base import BaseCommand, CommandError 
    from project.app import models as app_models 
    from django.db import models 
    from django.contrib.auth.models import Permission 
    from django.contrib.contenttypes.models import ContentType 
    import inspect 
    
    class Command(BaseCommand): 
    help = 'Create the read permission to app models' 
    
    def handle(self, *args, **options): 
        for name, obj in inspect.getmembers(app_models): 
         if inspect.isclass(obj) and issubclass(obj, models.Model): 
          try: 
           self.add_canread(obj) 
           self.stdout.write(self.style.SUCCESS(
            'created permission for %s' % obj 
           )) 
          except Exception as e: 
           self.stdout.write(self.style.ERROR(
            'Permission already exists for %s' % obj 
           )) 
    
    def add_canread(self, object_class): 
        """This a function that can be executed in order to create 
        new permissions (read view) to a class in DB. 
    
        """ 
        if inspect.isclass(object_class): 
         content_type = ContentType.objects.get_for_model(object_class) 
         permission = Permission.objects.create(
          codename='read_{}'.format(object_class._meta.model_name), 
          name='Can view {}'.format(object_class.__name__), 
          content_type=content_type, 
         ) 
        else: 
         msg = "The object is not a class" 
         print(msg) 
    
  4. Выполнить это после того, как делать миграции:

    python manage.py customread