2012-01-25 18 views
7

Mi piacerebbe avere un permesso più granulare nel mio progetto Django, ma non posso decidere quale app usare. Quello che ho è qualcosa di simile:Autorizzazioni 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) 

Ora con autorizzazioni standard Django ho la possibilità di scegliere tra aggiungere, modificare e cancellare, quello che voglio avere è un'autorizzazione cambiamento esteso, per offrire la possibilità di dare i diritti di gruppo solo per cambiare il logo, ad esempio, ma non consentire lo stesso gruppo di modificare la descrizione dell'oggetto. Non voglio o ho bisogno di un utente per entrare in relazione, ma semplicemente dare la possibilità a diversi gruppi di modificare singoli campi di un modello utilizzando l'interfaccia di amministrazione standard. Non sono nemmeno sicuro se sto parlando dell'autorizzazione per oggetto?

Qualcuno sa che cosa è meglio usare o come lo implementerei io stesso? Potrei anche immaginare di avere utenti di sola lettura che possano accedere/leggere tutto ma che non saranno in grado di modificare, anche questo non è possibile.

Grazie per qualsiasi aiuto.

+0

No, non si tratta di autorizzazioni a livello di oggetto. Risposta breve: potrebbe essere fattibile, ma è un sacco di codice. Risposta lunga: non puoi fare ciò che stai descrivendo in un amministratore di django vaniglia. Un approccio sarebbe quello di collegare ModelAdmins separati con i campi rilevanti abilitati per separare le istanze di AdminSite. Penso che dovrai probabilmente sottoclassi AdminSite per farlo controllare con i tuoi gruppi e codificare in modo rigido le autorizzazioni di ciascun gruppo: le autorizzazioni incorporate di django non hanno un concetto di campi consentiti/non consentiti. – AdamKG

+0

Grazie mille per la risposta attesa e la conferma.Non vedo l'ora di implementare sottoclassi AdminSite separate per raggiungere il mio compito. – tinti

risposta

7

La più flessibili, ma modo sarebbe quello di:

  1. scrivere qualche custom permissions (vale a dire can_modify_descr)
  2. scrivere yur propri Visualizzazioni Forms o ModelForms
  3. scrittura per rendere i moduli specificati.
  4. finalmente dovresti override some django admin templates e rendere i tuoi moduli in modelli che extend some standard django admin templates.

Per quanto posso vedere, questo è l'unico modo per ottenere ciò che si desidera, ma richiede anche molto lavoro.

+0

Grazie, puoi farlo anche nel modo descritto da AdamKG. In questo modo è molto più semplice, poiché non hai visualizzazioni personalizzate e modelli corrispondenti. – tinti

1

Un modo semplice per ottenere ciò è creare molti ModelAdmin per lo stesso modello (uno per ciascun "gruppo"). Per fare questo è necessario creare un Proxy Models per ogni "gruppo" come questo:

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

E poi basta per impostare le autorizzazioni del gruppo 1 per avere accesso solo a ItemGroup1, ecc.

Vedi questo post per maggiori informazioni: Using Proxy Models to Customize the Django Admin

0

Se si desidera gestire questo genere di cose oltre la vostra amministratore del sito, dare un'occhiata a django-logical-rules, dove è possibile scrivere le regole in Python e accedervi da vista o all'interno di un modello ;

Problemi correlati