2010-10-30 17 views
6

Ich habe eine einfache Frage. Wie erstelle ich eine Benutzerrolle in Django, ohne sie manuell in der Datenbank zu erstellen?Wie erstelle ich benutzerdefinierte Berechtigungen (Benutzerrollen) in Django?

EDIT: Ich muss spezifische Erlaubnis erstellen. Nur Benutzer mit dieser Berechtigung können das spezifische Modellfeld ändern. Ich brauche nur ein Feld 'readonly' für einige Benutzer zu machen. Ist es im Django möglich?

+0

Meinst du '/ admin/auth/group/add /'? –

+0

danke, aber ich muss spezifische Erlaubnis erstellen. Nur Benutzer mit dieser Berechtigung können das spezifische Modellfeld ändern. Ich muss nur ein Feld 'readonly' für einige Benutzer erstellen. –

+2

Sie können eine benutzerdefinierte Berechtigung wie 'can_change_xy' definieren und diese Berechtigung explizit mit' user.has_perm() 'in Ihrer Ansichtsfunktion überprüfen. Soweit ich weiß, gibt es keine generische Lösung für einzelne Feldberechtigungen. Siehe http://docs.djangoproject.com/en/dev/topics/auth/#custom-permissions und http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models .User.has_perm. –

Antwort

0

Sie könnten django-authority überprüfen. Sie können Berechtigungen auf Objektebene und sogar logische Prüfungen implementieren. Logische Prüfungen werden nicht in der Datenbank gespeichert, sondern sind Funktionen, die Werte übergeben und True oder False zurückgeben können. Shameless Stecker: meine Gabel implementiert die django 1.2 Objektberechtigungs Backend, so könnte man es gerne verwenden: userA.hasperm("see_xyz")

7

eine Dauerwelle Erstellen ohne DB bedeutet, dass Sie nicht django Berechtigungssystem verwendet werden soll. In diesem Punkt würde ich fragen, warum Sie es nicht verwenden möchten?

Wenn es in Ordnung ist django Erlaubnis sywstem zu verwenden, können Sie eine Berechtigung erstellen und überprüfen von admin speichern Methode overrriding ... wie:

in Ihrem models.py

class SomeModel(Model): 
    your_spec_field = FieldType(...) 
    class Meta: 
     permissions = (
      ("some_perm", u"A name for your default permission"), 
     ) 

In Ihrem verwandten admin.py

class SomeModelAdmin(ModelAdmin): 
    def save_model(self, request, obj, form, change): 
     if change: 
      curr_value = SomeModel.objects.get(pk=obj.id) 
      if not request.user.has_perm('<your_app>.some_perm'): 
       obj.your_spec_field = curr_value.your_spec_field 
     else: 
      if not request.user.has_perm('<your_app>.some_perm') 
       obj.your_spec_field = '' # or the default value according to your field type 
     obj.save() 

Bei diesem Ansatz, erhalten Sie den Status der zugehörigen Datensatz, bevor Sie es für ähnliche Erlaubnis speichern und überprüfen. Wenn der Benutzer nicht die erforderliche Dauerwelle hat. dann ersetzen Sie den Wert Ihres Felds durch den vorherigen. Wenn dies ein neuer Datensatz ist, legen Sie dieses Feld auf einen beliebigen Wert fest.

Verwandte Themen