101 votes

Comment puis-je utiliser les permissions de Django sans définir un type de contenu ou un modèle ?

J'aimerais utiliser un système de permissions pour restreindre certaines actions dans mon application Django. Ces actions n'ont pas besoin d'être liées à un modèle particulier (par exemple, l'accès aux sections de l'application, la recherche...), donc je ne peux pas utiliser l'option cadre des autorisations de stock directement, car le Permission requiert une référence à un type de contenu installé.

Je pourrais écrire mon propre modèle de permission, mais je devrais alors réécrire tous les éléments inclus dans les permissions de Django, tels que.. :

J'ai vérifié des applications comme django-autorité y django-guardian mais ils semblent fournir des autorisations encore plus liées au système de modèles, en permettant des autorisations par objet.

Existe-t-il un moyen de réutiliser ce cadre sans avoir défini aucun modèle (en dehors de User y Group ) pour le projet ?

2voto

arjun Points 6845

Vous pouvez utiliser le proxy model pour cela avec un type de contenu fictif.

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType

class CustomPermission(Permission):

    class Meta:
        proxy = True

    def save(self, *args, **kwargs):
        ct, created = ContentType.objects.get_or_create(
            model=self._meta.verbose_name, app_label=self._meta.app_label,
        )
        self.content_type = ct
        super(CustomPermission, self).save(*args)

Maintenant vous pouvez créer la permission avec juste name y codename de l'autorisation de la CustomPermission modèle.

 CustomPermission.objects.create(name='Can do something', codename='can_do_something')

Et vous pouvez interroger et afficher uniquement les autorisations personnalisées dans vos modèles comme ceci.

 CustomPermission.objects.filter(content_type__model='custom permission')

1voto

Francky_V Points 437

Pour ma part, pour tout projet d'envergure, je trouve utile d'avoir une application générique qui ne fait pas vraiment partie du modèle de données de mon projet. en soi - Je l'appelle typiquement "projectlibs". Il s'agit d'une application Django simple dans laquelle je place des éléments tels que des fixtures pour les importations, des templatetags qui peuvent être réutilisés pour plusieurs applications, etc. Certains de ces éléments sont des modèles que je réutilise souvent, donc l'avantage supplémentaire d'avoir ce type d'éléments dans une application est qu'ils sont réutilisables pour d'autres projets.

Donc à l'intérieur de ça projectlibs/models.py vous pourriez :

Vous pourriez créer cette "méta-application", en substance, et attribuer à l content_type à une classe fictive :

class UserRightsSupport(models.Model):
    class Meta:
        default_permissions = ()  # disable defaults add, delete, view, change perms
        permissions = (
            ("perm_name", "Verbose description"),
        )

0voto

ups Points 120

Toutes les réponses sont mauvaises pour moi, sauf celle-ci :

content_type = ContentType.objects.get_for_model(Permission)

Permission.objects.create(
    content_type=content_type,
    name='...', codename='...',
)

qui gère les permissions sans modèle sans ajouter de nouveaux modèles, mais en ajoutant de nouvelles valeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X