Filtrare gli oggetti visti dallo staff nell’admin di Django

Uno dei vantaggi dell’utilizzo di Django risiede nella possibilità di avere una interfaccia di amministrazione dei modelli praticamente già pronta.

Nel caso si abbiano più amministratori del portale si può però voler filtrare gli oggetti modificabili e visualizzabili dallo staff, a seconda dell’utente. Nel caso di un portale di notizie, ad esempio, può essere necessario filtrare l’elenco degli articoli mostrando solo quelli il cui autore è l’utente loggato, e dare solo al super amministratore la possibilità di vedere tutto.

In django 1.0 ci viene in aiuto la classe admin del nostro modello.
[sourcecode language=’python’]
class SchedaOptions(admin.ModelAdmin):
def has_change_permission(self, request, obj=None):
if obj and request.user == obj.referente: # (1)
return super(SchedaOptions, self).has_change_permission(request, obj)
elif obj is None or request.user.is_superuser:
return True
else:
return False

def queryset(self, request):
# Limit the queryset to some subset based on the value of user.
qs = super(SchedaOptions,self).queryset(request)
utente = request.user
if utente.is_superuser:
return qs
else:
return qs.filter(referente=utente) # (2)
[/sourcecode]

In questo esempio solo il referente di una scheda (referente == request.user) può modificare (vedi riga contrassegnata (1), ed il set di oggetti visualizzato (queryset) dall’admin è filtrato con la riga (2).

Una volta salvato provate a loggarvi con il superutente: nulla sarà cambiato (ed è bene che sia così nel 99% dei casi). Entrando con un utente staff, invece, vedrete solo gli oggetti che avete la possibilità di modificare.

About the Author

2 thoughts on “Filtrare gli oggetti visti dallo staff nell’admin di Django

  1. Luca - 22 Settembre 2008 at 02:06

    Ciao. Esiste una sorta di comunità di sviluppatori Python a Forlì?

  2. aronchi - 22 Settembre 2008 at 02:36

    Non esiste una vera e propria comunità, anche se in diversi sono iscritti al FoLUG.

Leave a Reply