Я полагаю, что первый вопрос, который вам нужно задать, - это какие разрешения вам нужны и какого типа. Я имею в виду, что вы хотите на уровне модели или объекта. Чтобы прояснить разницу, скажем, у вас есть модель Автомобиля. Если вы хотите предоставить разрешения для всех автомобилей, тогда подходит уровень модели, но если вы хотите предоставить разрешения для каждого автомобиля, вам нужен уровень объекта. Вам могут понадобиться и то, и другое, и, как мы увидим, это не проблема.
Что касается разрешений модели, Django обрабатывает их за вас ... в основном. Для каждой модели Django создаст разрешения в форме «appname.permissionname_modelname». Если у вас есть приложение под названием «драйверы» с моделью автомобиля, тогда одно разрешение будет «drivers.delete_car». Разрешения, которые автоматически создает Django, будут создавать, изменять и удалять. По какой-то странной причине они решили не включать разрешения на чтение из CRUD, вам придется сделать это самостоятельно. Обратите внимание, что Django по какой-то причине решил изменить CRUD «update» на «change». Чтобы добавить в модель дополнительные разрешения, скажем, разрешения на чтение, вы используете класс Meta:
class Car( models.Model ):
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 от washtontimes .