2012-03-30 9 views
1

Ich möchte eine can_view Meta-Berechtigung für jedes Modell in meiner Django App hinzufügen.Gibt es eine Möglichkeit, eine Meta-Berechtigung für jedes Modell in einer Django-App anzuwenden?

Ziemlich viel möchte ich dies in models.py zu jeder Klasse hinzuzufügen

class Meta: 
    permissions = [ ("can_view", "Can view {something}".format(something = self.verbose_name) ] 

Ich bin nicht einmal sicher, ob self.verbose_name auch wie in diesem Fall funktionieren würde ....

Ist das möglich ?

Bonus Frage: Sobald ich eine Genehmigung innerhalb des Meta Modell hinzufügen, dann kann ich es mit has_perm direkt anrufen? Wie

if request.user.has_perm('polls.can_view') : 
    # Show a list of polls. 
else : 
    # Say "Insufficient permissions" or something.  
+1

Ich habe mich gefragt, aber am Ende habe ich nur eine Handvoll Modelle, die eine Detailansicht haben, also habe ich nicht versucht, die Ansichtserlaubnis für alle Modelle zu aktivieren. Aber ich verstehe, dass es bei einem Projekt mit vielen Detailansichten mühsam sein kann, eins nach dem anderen zu tun. Auf der anderen Seite habe ich eine Basissichtklasse erstellt, die von dieser Berechtigungsprüfung erbt: https://gist.github.com/97b3a0f17aa6e4d35da8, das könnte helfen. Wenn Sie django-guardian nicht verwenden, können Sie es leicht anpassen. Außerdem: Vergessen Sie nicht, Ihre Fragen mit der Sprache zu markieren (ich habe das Python-Tag hinzugefügt) – jpic

+0

@jpic Ya, ich habe mich gefragt, warum Django 'can_view' nicht als eine ihrer Standardberechtigungen verwendet. Nun, ich habe nur 5 Modelle, die diese Berechtigungen benötigen. Vielleicht könnte ich Djangos "models.Model" -Klasse außer Kraft setzen? Es ist es wahrscheinlich nicht wert. Übrigens, danke, dass du mir in den letzten 2 Monaten mit Django geholfen hast. Du bist wie mein privater Mentor hier in SO :-). Kontrollierst du regelmäßig meine Fragen oder etwas lol? – hobbes3

Antwort

5

Erlaubnis ist auch eine gerade normale Django Modellinstanz. Sie können es wie jedes andere Modell erstellen.

Sie müssen also so etwas wie

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

for content_type in ContentType.objects.all(): 
    Permission.objects.create(content_type=content_type, codename='view_%s' % content_type.model, name='Can view %s' % content_type.name) 

Sie müssen es einmal tun, so post_syncdb Signal wie ein guter Ort für das aussieht.

+2

Ich mag das mehr als meins –

+0

Wo sollte ich diesen Code und wo sollte ich den 'post_syncdb'-Signal-Code? – hobbes3

+0

@ hobbes3 https: //docs.djangoproject.com/de/dev/topics/signals/ – DrTyrsa

1

Der einfachste und offensichtlichste Ansatz wäre ein benutzerdefiniertes Basismodell, das ein Elternteil aller Ihrer Modelle ist. Auf diese Weise werden Sie (oder ein anderer Programmierer) sich jemals fragen, woher der Teufel can_view kommt.

class CustomBaseModel(models.Model): 
    class Meta: 
     abstract = True 
     permissions = [ ("can_view", "Can view {something}".format(something = self.verbose_name) ] 

class SomeModel(CustomBaseModel): 
    # ... 

Dies erfordert jedoch Sie alle Ihre Modelle zu ändern, und es wird sich nicht ändern Djangos gebautet Modelle (wie User) (dies leicht mit einer kleinen Suche & ersetzen gemacht wird).

+0

Dies wird 'NameError: Name 'self' ist nicht definiert ' – DrTyrsa

+0

Wie * würde * Ich' can_view' zu 'User' auch hinzufügen? Ich denke, das ist eher eine Python-Frage. Ich weiß, wie man Klassen erbt und erweitert, aber das würde ihm einen anderen Namen geben. Wie kann ich diese eingebauten Django-Klassen * ersetzen und erweitern und denselben Namen beibehalten (ohne den Quellcode zu ändern)? So ähnlich wie Django-Admin-Seiten anpassen, indem Sie ihre Vorlagen mit Ihren überschreiben. – hobbes3

+0

Oder vielleicht sollte ich die 'can_view' auf' UserProfile' anwenden? Wie auch immer, meine Frage war eher eine Python-Perspektive, nicht Django, also würde ich immer noch gerne eine Lösung für meine hypothetische Frage finden. – hobbes3

Verwandte Themen