Permitir acceso a páginas según el rol del usuario django 1.8

390 views
Skip to first unread message

taty 901009

unread,
Aug 1, 2016, 3:06:08 PM8/1/16
to Django-es
Hola tengo en mi aplicación 3 grupos de usuarios: secretaria, directora, técnico. Quiero mostrar en la barra de navegación la página correspondiente a cada rol una vez que el usuario de dicho rol haya iniciado sesión.

Este es el código de mi view:

    def barra_navegacion(request):
        user
= request.user
        g
= user.groups.all()
       
return render_to_response('gestiondoc/barra_panel.html', {'g':g},
                                context_instance
=RequestContext(request)



este es un fragmento del código de la barra:

    {% if user.is_authenticated %}
       
...
   
{% if g == 'secretaria' %}
       
<li><a href="{% url 'secretaria' %}">Panel Secretaria</a></li>
           
{% elif g == 'tecnico' %}
               
<li><a href="{% url 'tecdocente' %}">Panel Técnico Docente</a></li>
           
{% elif g == 'directora' %}
               
<li><a href="{% url 'directora' %}">Panel Directora</a></li>
       
{% endif %}
         
</ul>
        </
li>
       
{% else %}
                 
<li><a href="{% url 'account_login' %}">Entrar</a></li>
       
{% endif %}



No me carga el grupo del usuario a pesar de pertenecer a secretaria, g es una lista vacía.

También lo intenté poniendo en la base:

    {% if 'secre' in request.user.perfil.grupo %}
     
{% include "gestiondoc/barra_panel.html" %}
   
{% else %}
   
{% include "gestiondoc/barra_usuario.html" %}  



Pero salta al else directamente.

Perfil es un modelo que tiene un método grupo:

      def grupo(self):
         
return self.usuario.groups.values_list('name', flat=True)


Antes mostraba
[<Group:'secretaria>]

, pero ahora ni siquiera reconoce el grupo del usuario.
He intentado varias formas, pero no he tenido éxito. Gracias de antemano.

francisco del roio

unread,
Aug 2, 2016, 8:05:34 AM8/2/16
to djan...@googlegroups.com
Hola,

Lo ideal en realidad sería hacer algo como esto:

{% if "secretaria" in user.groups %}
...
{% endif %}

Además, no necesitas una vista dedicada a la barra de navegación, ya que
el usuario autenticado se expone a tu context gracias al middleware de
la aplicación auth.

Saludos,
--
¡Cuando tus fuerzas terminan, las de Dios comienzan!

Ricardo Daniel Quiroga

unread,
Aug 2, 2016, 10:23:51 AM8/2/16
to Grupo Django-Es
Hola
yo lo haria directamente en la vista para no ensuciar tanto la plantilla con demasiados if else, despues solo escribiria los navbar correspondiente para cada uno
como pequeñas plantillas y haria algo como lo siguiente que es mas limpio a mi parecer ya que mantengo la logica fuera de la vista

#controller

if "secretaria" in request.user.group:
   navbar = "secretaria.html" 
...

#vista

{%  include navbar %}
 
Saludos





--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
 Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
 Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
 Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a django-es+...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.



--

Ricardo Daniel Quiroga

monoBOT

unread,
Aug 3, 2016, 10:28:21 AM8/3/16
to djan...@googlegroups.com
Yo huyo de la lógica de las vistas lo máximo posible ... puestos a buscar opciones podrías también delegar la creación de ese navegador a la instancia del usuario, en plan:

from django.contrib.auth.models. import User
class MyUser(User):
    def myNavbar(self):
         if esto 
               navbar = 'bla'
         elif lo otro 
               navbar = 'bla bla'
         elif lo de mas alla
               navbar = 'bla bla bla'
         return navbar

Estate seguro de escapar correctamente los caracteres especiales y ya

Pero vamos ... yo usaría la plantilla, al fin y al cabo el navbar es un asunto html y es lógico delegar su construcción a la plantilla


Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
monoBOT
Visite mi sitio(Visit my site): monobotsoft.es/blog/
Reply all
Reply to author
Forward
0 new messages