Django a un modèle appelé Permission
, qui est automatiquement généré lorsque vous créez un modèle Django. Par conséquent, il est possible de limiter le fait que seuls les utilisateurs disposant de l'autorité correspondante peuvent créer, mettre à jour et supprimer des données de table sur l'écran de gestion. Cette fois, je voudrais utiliser cette Permission
pour limiter la vue.
Permission
Créons-en un nouveau sans utiliser les données existantes Permission
.
ContentType
Le modèle Permission
vous oblige à spécifier ContentType
comme clé externe, il doit donc y avoir un ContentType
correspondant. Je pense que vous pouvez spécifier le ContentType
de l'application avec la vue que vous essayez de limiter, mais vous pouvez créer la vôtre.
from django.contrib.contenttypes.models import ContentType
ContentType.objects.create(
app_label='app_label', name='name', model='model')
Le nom de l'application est spécifié sous la forme ʻapp_label. En d'autres termes, c'est la fin du nom du module spécifié dans des paramètres tels que ʻINSTALLED_APPS
.
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get(
app_label='app_label', name='name', model='model')
Permission.objects.create(
content_type_id=content_type.id, name='name', codename='codename')
name
est un nom d'affichage pour les permissions telles que'Peut ajouter une permission'
, et codename
est un nom distinctif tel que'add_permission'
.
Vous pouvez accorder des autorisations depuis l'écran d'édition utilisateur de l'écran de gestion Django.
Vous pouvez vérifier si vous avez une Permission
spécifique en appelant has_perm
de l'instance ʻUser`. Passez-le en argument sous la forme app_label.codename ''. Par exemple, l'autorisation d'ajouter un utilisateur est
'auth.add_user' '.
from django.contrib.auth import get_user_model
User = get_user_model()
user = User.objects.get(pk=1)
user.has_perm('{app_label}.{codename}'.format(
app_label='app_label', codename='codename'))
(Notes complémentaires)
À titre de référence, dans Django, si vous souhaitez créer une vue que seuls les utilisateurs du personnel peuvent voir, il existe un moyen d'utiliser un décorateur.
from django.contrib.admin.views.decorators import staff_member_required
from django.utils.decorators import method_decorator
from django.views.generic.base import View
class SpamView(View):
@method_decorator(staff_member_required)
def dispatch(self, *args, **kwargs):
return super(SpamView, self).dispatch(*args, **kwargs)
En imitant cela, nous créerons une vue qui ne peut être consultée que par des utilisateurs disposant d'autorisations spécifiques.
decorators.py
from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.auth.decorators import user_passes_test
def get_permission_deco(permission_codename,
redirect_field_name=REDIRECT_FIELD_NAME,
login_url='admin:login'):
def deco(view_func):
return user_passes_test(
lambda u: u.has_perm(permission_codename),
login_url=login_url,
redirect_field_name=redirect_field_name
)(view_func)
return deco
view.py
from django.utils.decorators import method_decorator
from django.views.generic.base import View
from .decorators import get_permission_deco
class EggView(View):
@method_decorator(get_permission_deco('app_label.codename'))
def dispatch(self, *args, **kwargs):
return super(EggView, self).dispatch(*args, **kwargs)
Il y avait un permission_required
dans Django sans aucune astuce.
https://docs.djangoproject.com/ja/1.10/topics/auth/default/#the-permission-required-decorator
Les détails de la création d'une balise personnalisée dépassent le cadre de cet article, je vais donc l'omettre, mais je pense qu'il est possible de limiter le modèle à l'aide d'une balise personnalisée, je vais donc donner un exemple.
perm_extra.py
from django import template
register = template.Library()
@register.filter(name='has_perm')
def has_perm(user, permission_name):
return user.has_perm(permission_name)
{% load perm_extra %}
{% if user|has_perm:'app_label.codename' %}
<a href="/path">Pour modifier la page</a>
{% else %}
<del>Aller à la page d'édition</del>(Pas autorisé)
{% endif %}