Je suppose que la première question que vous devez vous poser sont les autorisations que vous avez besoin et de quelle sorte. Par quelle sorte, je veux dire, voulez-vous de Modèle - ou au niveau de l'Objet. Afin de clarifier la différence que vous avez un modèle de Voiture. Si vous souhaitez accorder des autorisations sur toutes les voitures, puis au niveau du Modèle est approprié, mais si vous voulez donner des autorisations sur chaque voiture de base que vous voulez au niveau de l'Objet. Vous pouvez avoir besoin à la fois, et ce n'est pas un problème, comme nous allons le voir.
Pour le Modèle d'autorisations, Django gère pour vous... la plupart du temps. Pour chaque modèle Django va créer des autorisations dans le formulaire 'appname.permissionname_modelname'. Si vous avez une application appelée "pilotes" avec le modèle de Voiture alors une autorisation serait " pilotes.delete_car'. Les autorisations de Django crée automatiquement seront les créer, les modifier et les supprimer. Pour une raison étrange, ils ont décidé de ne pas inclure les autorisations de lecture de CRUD, vous devrez le faire vous-même. Notez que Django a décidé de changer CRUD 'mise à jour' pour 'modifier', pour quelque raison. Pour ajouter plus d'autorisations à un modèle d'autorisations de lecture, vous utilisez la Méta-classe:
class Car( models.Model ):
# model stuff here
class Meta:
permissions = (
( "read_car", "Can read Car" ),
)
Notez que les autorisations est un ensemble de n-uplets, où le n-uplet d'éléments sont la permission, comme décrit ci-dessus et une description de cette autorisation. Vous n'avez pas à suivre les permname_modelname convention, mais j'ai l'habitude de rester avec elle.
Enfin, pour vérifier les autorisations, vous pouvez utiliser has_perm:
obj.has_perm( 'drivers.read_car' )
Où obj est soit un Utilisateur ou un Groupe d'instance. Je pense qu'il est plus simple d'écrire une fonction pour ça:
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
Où l'entité est l'objet de vérifier les autorisations sur (Utilisateur ou de Groupe), le modèle est l'instance d'un modèle, la permanente est une liste d'autorisations comme des chaînes de vérifier (par exemple, ['lire', 'modifier']), et l'application est le nom de l'application chaîne de caractères. Faire la même vérification que has_perm ci-dessus vous pourriez dire quelque chose comme ceci:
result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )
Si vous avez besoin d'utiliser un objet ou d'autorisations de ligne (ils signifient la même chose), puis Django ne peux pas vraiment vous aider en lui-même. La bonne chose est que vous pouvez utiliser à la fois le modèle et l'objet des autorisations side-by-side. Si vous voulez les autorisations de l'objet, vous devrez écrire votre propre (si vous utilisez 1.2+) ou trouver un projet à quelqu'un d'autre a écrit, celui que j'aime est django-objectpermissions de washingtontimes.