Django hat ein Modell namens "Berechtigung", das automatisch generiert wird, wenn Sie ein Django-Modell erstellen. Infolgedessen kann eingeschränkt werden, dass nur Benutzer mit der entsprechenden Berechtigung Tabellendaten auf dem Verwaltungsbildschirm erstellen / aktualisieren / löschen können. Dieses Mal möchte ich diese "Berechtigung" verwenden, um die Ansicht einzuschränken.
Erstellen wir eine neue, ohne die vorhandenen Berechtigungsdaten zu verwenden.
Für das "Berechtigungs" -Modell müssen Sie "ContentType" als externen Schlüssel angeben, daher muss ein entsprechender "ContentType" vorhanden sein. Ich denke, Sie können den "ContentType" der Anwendung angeben, die die Ansicht hat, die Sie einschränken möchten, aber Sie können Ihre eigene erstellen.
from django.contrib.contenttypes.models import ContentType
ContentType.objects.create(
app_label='app_label', name='name', model='model')
Der Anwendungsname wird als "app_label" angegeben. Mit anderen Worten, es ist das Ende des Modulnamens, der in "INSTALLED_APPS" der Einstellungen angegeben ist.
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" ist ein Anzeigename für Berechtigungen wie "Kann Berechtigung hinzufügen" und "Codename" ist ein definierter Name wie "Add_Permission".
Sie können Berechtigungen über den Benutzerbearbeitungsbildschirm des Django-Verwaltungsbildschirms erteilen.
Sie können überprüfen, ob Sie über eine bestimmte Berechtigung verfügen, indem Sie "has_perm" der "User" -Instanz aufrufen. Übergeben Sie es als Argument in der Form "app_label.codename". Die Berechtigung zum Hinzufügen eines Benutzers lautet beispielsweise "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'))
(Zusätzliche Bemerkungen)
Wenn Sie in Django eine Ansicht erstellen möchten, die nur Benutzer sehen können, gibt es eine Möglichkeit, einen Dekorateur zu verwenden.
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)
Indem wir dies nachahmen, erstellen wir eine Ansicht, die nur von Benutzern mit bestimmten Berechtigungen angezeigt werden kann.
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)
In Django gab es eine "Erlaubnis erforderlich" ohne Tricks. https://docs.djangoproject.com/ja/1.10/topics/auth/default/#the-permission-required-decorator
Die Details zum Erstellen eines benutzerdefinierten Tags gehen über den Rahmen dieses Artikels hinaus. Daher werde ich es weglassen. Ich denke jedoch, dass es möglich ist, die Vorlage mithilfe eines benutzerdefinierten Tags einzuschränken. Daher werde ich ein Beispiel geben.
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">Gehen Sie zur Bearbeitungsseite</a>
{% else %}
<del>Gehen Sie zur Bearbeitungsseite</del>(Nicht genehmigt)
{% endif %}