2012-02-25 6 views
7

In Django qual è il modo migliore per implementare modelli con funzionalità aggiuntive per gli utenti con autorizzazioni di "admin".Django - Visualizzazione di modelli diversi per gli amministratori

Non sono sicuro di dover creare un set di viste completamente diverse specifiche per gli amministratori o integrarle nelle mie viste esistenti e modelli come "se l'utente è un amministratore" ovunque.

C'è un modo standard per farlo in Django?

risposta

2

Se avete la l'utente disponibili nel contesto del modello si può fare:

{% if user.is_active and user.is_staff %} 
    Only the admin will see this code. For example include some admin template here: 
    {% include "foo/bar.html" %} 
{% endif %} 

utente sarà disponibile nel modello F si utilizza RequestContext e l'impostazione del TEMPLATE_CONTEXT_PROCESSORS contiene django.contrib.auth.context_processors.auth, che è di default. Vedi authentication data in templates come riferimento.

6

Questo mostrerà la roba solo se si è attivi e il personale non admin:

{% if request.user.is_active and request.user.is_staff %} 
    {% include "foo/bar.html" %} 
{% endif %} 

se vuoi mostrare solo e soltanto per admin quello che dovete fare che:

{% if request.user.is_superuser %} 
    ADD your admin stuff there. 
{% endif %} 

Differenze circa questi campi here.

2

Sono un sostenitore di mantenere la logica fuori dal livello di visualizzazione (parlando in generale del modello di progettazione MVC). Quindi, perché non utilizzare i decoratori per indirizzare l'utente a visualizzazioni diverse in base al loro privilegio? Nella tua urls.py, definire un modello per gli amministratori:

url(r'^admin/$', 'user.views.admin_index'), 
#do so for your other admin views, maybe more elegantly than this quick example 

quindi definire una decoratrice a calci l'utente se non sono un amministratore

def redirect_if_not_admin(fn): 
def wrapper(request): 
    if request.user.is_staff(): 
     return fn(request) 
    #or user.is_superuser(), etc 
    else: 
     return HttpResponseRedirect('/Permission_Denied/') 
return wrapper 

E nelle viste di amministrazione

@redirect_if_not_admin 
def index(request): 
##do your thing 

È più codice rispetto alle altre due risposte, che non sono sbagliate. È solo una preferenza personale per mantenere il disordine nelle viste.