Как использовать группы и разрешения Django?

Я понимаю основные пользовательские вещи. Я знаю аутентификацию, логин, создание учетных записей и т. д. Но теперь я хочу работать над группами и разрешениями.

где документация для групп/разрешений django? Это не так: http://docs.djangoproject.com/en/dev/topics/auth/

1 ответов


Я полагаю, что первый вопрос, который вы должны спросить, какие разрешения вам нужны и какие. Под каким видом, я имею в виду, вы хотите модель - или объектный уровень. Чтобы уточнить разницу, скажем, у вас есть модель автомобиля. Если вы хотите предоставить разрешения на все автомобили, то уровень модели подходит, но если вы хотите предоставить разрешения на каждый автомобиль, вы хотите уровень объекта. Вам может понадобиться и то, и другое, и это не проблема, как мы увидим.

для разрешений модели Django обрабатывает их для вы... в основном. Для каждой модели Django создаст разрешения в виде "appname".permissionname_modelname'. Если у вас есть приложение под названием "водители" с моделью автомобиля, то одно разрешение будет " водители.delete_car'. Разрешения, которые автоматически создает Django, будут создавать, изменять и удалять. По какой-то странной причине они решили не включать разрешения на чтение из CRUD, вам придется сделать это самостоятельно. Обратите внимание, что Django решил изменить "обновление" CRUD на "изменение" для некоторых причина. Чтобы добавить дополнительные разрешения к модели, скажем, разрешения на чтение, вы используете мета-класс:

class Car( models.Model ):
    # model stuff here
    class Meta:
        permissions = ( 
            ( "read_car", "Can read Car" ),
        )

обратите внимание, что разрешения-это набор кортежей, где элементы кортежа-это разрешение, как описано выше, и описание этого разрешения. Вам не нужно следовать соглашению permname_modelname, но я обычно придерживаюсь его.

наконец, чтобы проверить разрешения, вы можете использовать has_perm:

obj.has_perm( 'drivers.read_car' )

где obj является экземпляром пользователя или группы. Я думаю для этого проще написать функцию:

def has_model_permissions( entity, model, perms, app ):
    for p in perms:
        if not entity.has_perm( "%s.%s_%s" % ( app, p, model.__name__ ) ):
            return False
    return True

где entity-объект для проверки разрешений (группа или пользователь), model-экземпляр модели, perms-список разрешений в виде строк для проверки (например, ['read', 'change']), а app-имя приложения в виде строки. Чтобы сделать ту же проверку, что и has_perm выше, вы бы назвали что-то вроде этого:

result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )

Если вам нужно использовать разрешения объекта или строки (они означают то же самое), то Django не может действительно помочь ты сам по себе. Хорошо, что вы можете использовать разрешения модели и объекта бок о бок. Если вам нужны разрешения на объект, вам придется либо написать свой собственный (если используется 1.2+) или найти проект, написанный кем-то другим, мне нравится django-objectpermissions от washingtontimes.