2012-01-25 13 views
7

Django projemde daha ayrıntılı bir izin almayı çok isterdim, ancak hangi uygulamanın kullanılacağına karar veremiyorum. Ne var gibi bir şeydir:Django izinleri

Django standart izinlerle Şimdi
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) 

Ben eklenti, değişim arasında seçim ve silme, ne olmasını istiyorsanız genişletilmiş değişiklik izni olduğunu verme yeteneğini sunmayı olanağına sahip Grup haklarını yalnızca örneğin logoyu değiştirmek, ancak aynı grubun öğe açıklamasını değiştirmesine izin vermemek. Bir kullanıcının giriş ilişkisine başvurmasını istemiyorum ya da buna ihtiyaç duymuyorum, ancak standart grup arayüzünü kullanarak bir modelin tek alanlarını düzenlemek için farklı gruplara olanak sağlamanız yeterli. Nesne başına izinlerden mi söz ettiğimden bile emin değilim?

Neyin en iyi kullanılacağını veya nasıl uygulayacağımı bilen biri var mı? Ayrıca, her şeye erişebilen/okuyabilecek ancak değişiklik yapamayan salt okunur kullanıcılara sahip olabileceğimi de hayal edebiliyorum, bu da mümkün değil.

Yardımlarınız için teşekkür ederiz.

+0

Hayır, bunlar nesne düzeyinde izinler değildir. Kısa cevap: yapılabilir, ancak çok fazla kod var. Uzun cevap: Bir vanilla django yöneticisinde tarif ettiğiniz şeyi yapamazsınız. Bir yaklaşım, ayrı ModelAdmins'i AdminSite örneklerini ayırmak için etkin olan ilgili alanlarla bağlantı kurmaktır. Yöneticilerinizin gruplarını kontrol etmesini ve her grubun sahip olduğu izinleri sabit kodla doldurmak için AdminSite alt sınıfını kullanmanız gerektiğini düşünürüm; django'nun yerleşik izinlerinde izin verilen/izin verilmeyen alanlar var. – AdamKG

+0

Beklenen cevap ve onay için çok teşekkür ederim.Görevimi gerçekleştirmek için ayrı AdminSite alt sınıflarını uygulamak için sabırsızlanıyorum. – tinti

cevap

7

en esnek ama yolu olacaktır:

  1. bazı custom permissions (yani can_modify_descr)
  2. belirttiğiniz formları işlemek için yur kendi Forms veya ModelForms
  3. yazma Görüntüleme yazma yazma.
  4. nihayet override some django admin templates zorunda ve bu extend some standard django admin templates şablonları Şekilleri işlemek istiyorum.

Bu görebildiğim kadarıyla, istediğinizi elde etmenin tek yolu, ama aynı zamanda çok fazla iş gerektiriyor. Bunu başarmak için

+0

Teşekkürler, ayrıca AdamKG tarafından açıklanan şekilde de yapabilirsiniz. Özel görünümleriniz ve karşılık gelen şablonlarınız olmadığı için bu yol çok daha kolay. – tinti

1

basit bir yol aynı model (her bir "grubun" için bir tane) için pek çok ModelAdmin yaratmaktır.

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') 

Sonra da gerekir: Böyle her bir "grubun" için bir Proxy Models oluşturmanız gerekir Bunu yapmak için Grup 1'in izinlerini yalnızca ItemGroup1, vb. erişim iznine ayarlamak için.

Daha fazla bilgi için bu gönderiyi görün: Using Proxy Models to Customize the Django Admin

0

Bu tür bir şeyi yönetici sitenizin ötesine taşımak istiyorsanız, kurallarınızı python'a yazıp bunlara görünümlerden veya şablon içinde erişebileceğiniz django-logical-rules'a bakın. ;