2012-02-25 19 views
7

En Django, ¿cuál es la mejor manera de implementar plantillas con funcionalidad extra para usuarios con permisos de 'administrador'?Django - Mostrando diferentes plantillas para administradores

No estoy seguro de si debería crear un conjunto de vistas completamente específicas para administradores o integrarlo en mis vistas existentes y plantillas como 'si el usuario es un administrador' en todas partes.

¿Hay una manera estándar de hacer esto en Django?

Respuesta

2

Si usted tiene el usuario disponibles en el contexto de la plantilla que puede hacer:

{% 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 %} 

usuario estará disponible en su plantilla f utiliza RequestContext y su entorno TEMPLATE_CONTEXT_PROCESSORS contiene django.contrib.auth.context_processors.auth, que es por defecto. Ver authentication data in templates como referencia.

6

Esto mostrará las cosas sólo si está activo y el personal no administrador:

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

si quieres mostrar sólo y únicamente para el administrador que tiene que hacer lo siguiente:

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

Diferencias sobre estos campos here.

2

Soy un defensor de mantener tanta lógica fuera de la capa de vista (hablando en general sobre el patrón de diseño de MVC). Entonces, ¿por qué no usar decoradores para dirigir a su usuario a diferentes vistas según su privilegio? En su urls.py, definir un patrón para los administradores:

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

a continuación, definir un decorador de patear al usuario si no son un administrador

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 

Y en sus puntos de vista de administración

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

Es más código que las otras dos respuestas, que no son incorrectas. Es solo una preferencia personal para mantener el desorden en las vistas.

Cuestiones relacionadas