2012-01-25 18 views
7

Chciałbym mieć bardziej szczegółowe uprawnienia w moim projekcie Django, ale nie mogę zdecydować, z której aplikacji korzystać. Co mam coś takiego jak:Uprawnienia Django

class Item(models.Model): 
    name = models.CharField(max_length=64, unique=True) 
    description = models.CharField(max_length=128, default='') 
    logo = ImageField(upload_to=/tmp, blank=True, null=True) 

Teraz z uprawnieniami standardowymi Django mam możliwość wyboru pomiędzy dodawać, zmieniać i usuwać, co chcę mieć to uprawnienie zmiany rozszerzony, aby zaoferować możliwość nadawania grupuj tylko prawa do zmiany logo, ale nie zezwalaj tej samej grupie na modyfikowanie opisu przedmiotu. Nie chcę ani nie potrzebuję relacji użytkownik-użytkownik, ale po prostu daje możliwość różnych grup do edycji pojedynczych pól modelu przy użyciu standardowego interfejsu administratora. Nie jestem nawet pewien, czy mówię o pozwoleniu na obiekt?

Czy ktoś wie, co najlepiej użyć lub w jaki sposób sam go wdrożyć? Mogę sobie również wyobrazić, że mam tylko do odczytu użytkowników, którzy mogą uzyskać dostęp do/przeczytać wszystko, ale nie będą mogli modyfikować, nie jest to możliwe ani.

Dzięki za pomoc.

+0

Nie, to nie są uprawnienia na poziomie obiektu. Krótka odpowiedź: może być wykonalna, ale jest dużo kodu. Długa odpowiedź: nie możesz zrobić tego, o czym piszesz w waniliowym django. Jednym z podejść byłoby podłączenie osobnych modeli ModelAdmins do odpowiednich pól włączonych w celu oddzielenia instancji AdminSite. Myślę, że prawdopodobnie będziesz musiał podklasować AdminSite, aby sprawdziło to w twoich grupach, i zakodować na sztywno uprawnienia każdej grupy - uprawnienia wbudowane django nie mają pojęcia dozwolonych/niedozwolonych pól. – AdamKG

+0

Dziękuję bardzo za spodziewaną odpowiedź i potwierdzenie.Będę oczekiwał wdrożenia oddzielnych pod-klas AdminSite, aby osiągnąć moje zadanie. – tinti

Odpowiedz

7

Najbardziej elastyczne, ale sposobem byłoby:

  1. napisać jakiś custom permissions (tj can_modify_descr)
  2. napisać yur własne Forms lub ModelForms
  3. zapisu widoków do wyrenderować określone formy.
  4. na koniec musisz override some django admin templates i wyrenderować swoje formularze w szablonach o numerach extend some standard django admin templates.

O ile widzę, jest to jedyny sposób, aby osiągnąć to, co chcesz, ale także wymaga dużo pracy.

+0

Dzięki, możesz to zrobić również w sposób opisany przez AdamKG. W ten sposób jest znacznie łatwiej, ponieważ nie masz niestandardowych widoków i odpowiednich szablonów. – tinti

1

Jednym prostym sposobem na osiągnięcie tego jest stworzenie wielu ModelAdmin dla tego samego modelu (po jednym dla każdej "grupy"). Aby to zrobić, że trzeba utworzyć jeden Proxy Models dla każdego "grupy" jak ta:

models.py

class Item(models.Model): 
    name = models.CharField(max_length=64, unique=True) 
    description = models.CharField(max_length=128, default='') 
    logo = ImageField(upload_to=/tmp, blank=True, null=True) 

class ItemGroup1(Item): 
    class Meta: 
     proxy = True 

admin.py

class ItemAdmin(models.ModelAdmin): 
    ... 

class ItemGroup1Admin(models.ModelAdmin): 
    readonly_fields = ('logo', 'description') 

A potem wystarczy aby ustawić uprawnienia grupy 1 tylko na dostęp do ItemGroup1, itp.

Zobacz ten post, aby uzyskać więcej informacji: Using Proxy Models to Customize the Django Admin

0

Jeśli chcesz obsługiwać tego rodzaju rzeczy poza swoim miejscu administratora, spojrzeć na django-logical-rules, gdzie można napisać reguły w Pythonie i dostęp do nich z widokiem lub w szablonie ;