mostrar a un usuario solo sus registros

999 views
Skip to first unread message

cesar

unread,
Jan 19, 2011, 10:05:27 PM1/19/11
to Django-es
Hola grupo...soy nuevo en esto de Django y tengo una duda. Quisiera
saber si se puede hacer que cada Usuario que se loguea a la parte de
administracion de Django vea solo los registros que él ha creado. Es
decir, supongamos que tengo una clase llamada Departamento, en esta
clase disitintos usuarios van a cargar sus Departamentos..pero deseo
que cada usuario cuando se loguea solo pueda ver y modificar sus
Departamentos.. Es posible hacer esto? Espero haberme explicado bien..
Gracias.

Javi

unread,
Jan 20, 2011, 6:23:23 AM1/20/11
to Django-es
Hola Cesar,

Para modificar el comportamiento de la vista de administración según
cada usuario debes reimplementar la función queryset en tu archivo
admin.py, algo así, no hace falta que tomes el código al pie de la
letra, es un ejemplo:

DepartamentosAdmin(models.Model):
list_display = ...
list_filter = ...
ordering = ...
...

"""
Listados personalizados
"""
def queryset(self, request):
# obtenemos el listado original
qs = super(OrderAdmin, self).queryset(request)
# trabajamos con él para, por ejemplo, mostrar sólo entradas
cuyo user sea igual al que realiza la petición
qs = qs.exclude(user!=request.user)
# se devuelve el listado
return qs

admin.register(Departamentos, DepartamentosAdmin)

Ya nos contarás tus avances.
Javi.

Nacho

unread,
Jan 21, 2011, 2:20:00 AM1/21/11
to Django-es
> Para modificar el comportamiento de la vista de administración según
> cada usuario debes reimplementar la función queryset en tu archivo
> admin.py

¡No conocía eso! ¡Gracias! :)

cesar

unread,
Jan 21, 2011, 5:21:33 PM1/21/11
to Django-es
Primero que nada muchas gracias Javi por responder a mi duda...estuve
probando lo que me sugiriste y no he podido hacer que funcione.
EL error que me figura es:
'global name 'user' is not defined'

y es en la linea:
qs = qs.exclude(user!=request.user)

que sería la variable user a la que estamos haciendo referencia?? me
falta agregar algo al modelo??
Tal vez me este faltando importar algo..
Desde ya...gracias por la ayuda

Javi

unread,
Jan 22, 2011, 6:18:56 AM1/22/11
to Django-es
Hola de nuevo Cesar,

efectivamente el parámetro user tiene que corresponderse con un
atributo del modelo.
Desconozco como lo tienes definido pero imagino que en algún lugar
guardarás qué usuario ha creado ese departamento,
imagino algo del tipo de:

from django.contrib.auth import User

def Departamento(models.Model):
nombre = models.CharField(...)
propietario = models.ForeignKey(User)
...

Pues bien, en ese caso el listado se filtraría en admin.py con algo
como:

qs = qs.filter(propietario=request.user)

(Antes no me dí cuenta que es un poco tonto excluir y además negar, es
más claro filtrar coincidencias)

Espero que te sirva de aclaración,
Javi.

cesar

unread,
Jan 22, 2011, 1:18:37 PM1/22/11
to Django-es
Hola Javi...te cuento que me fue bien con los consejos que me
diste...asque muchisimas gracias.
Ahora te realizo otra consulta...ligada al mismo ejemplo. Como está el
modelos ahora, cuando estoy creando un Departamento me aparece un
combo para seleccionar al usuario que está creando el mismo. Como
puedo hacer para que directamente me guarde en el campo 'propietario'
el usuario que está logueado y creando el departamento?..y asi no
tener que estar seleccionando de un combo. Yo supongo que tengo que
reimplementar alguna funcion que me coloque en el campo propietario
el valor de request.user....
Desde ya muchas gracias...me aclaraste muchisimo el panorama.
> > > ¡No conocía eso! ¡Gracias! :)- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

Javi

unread,
Jan 23, 2011, 7:01:31 AM1/23/11
to Django-es
Hola Cesar, me alegra que te hayan orientado los consejos :D.

De nuevo vas bien encaminado en pensar que hay que reimplementar
alguna función.
En particular estaríamos hablando de la función save_model() de la
clase DepartamentoAdmin (o similar que trate el modelo Departamento en
el archivo admin.py), para que cada vez que guardes una instancia tome
el usuario actual.
Suponiendo el mismo ejemplo de clase Departamento de los anteriores
mensajes, la clase DepartamentoAdmin podría ser similar a:

admin.py

class DepartamentoAdmin(admin.ModelAdmin):
list_display = (...)
fieldsets = [...]
...

def save_model(self, request, obj, form, change):
if getattr(obj, 'propietario', None) is None:
obj.propietario = request.user
obj.save()

Con eso el propietario quedará asociado al usuario que guardó el
departamento.
Luego puedes evitar que se liste en el formulario de administración
dejando sin incluir el campo propietario en el atributo fieldsets.

Puedes leer más información sobre reimplementar el método save_model()
aquí: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model
Y luego puedes simplemente no mostrar el campo propietario con
excluirlo del diccionario fieldsets, más info aquí:
http://docs.djangoproject.com/en/dev/ref/contrib/admin/

Saludos,
Javi.

cesar

unread,
Jan 23, 2011, 5:02:11 PM1/23/11
to Django-es
Gracias Javi!! anduvo espectacular!! muchas gracias por la ayuda
prestada.. Espero poder seguir avanzando con Django, la verdad es muy
interesante para aprender.
Saludos...y seguramente seguire haciendo otra consulta en cualquier
momento :)

On 23 ene, 09:01, Javi <javi.azu...@gmail.com> wrote:
> Hola Cesar, me alegra que te hayan orientado los consejos :D.
>
> De nuevo vas bien encaminado en pensar que hay que reimplementar
> alguna función.
> En particular estaríamos hablando de la función save_model() de la
> clase DepartamentoAdmin (o similar que trate el modelo Departamento en
> el archivo admin.py), para que cada vez que guardes una instancia tome
> el usuario actual.
> Suponiendo el mismo ejemplo de clase Departamento de los anteriores
> mensajes, la clase DepartamentoAdmin podría ser similar a:
>
> admin.py
>
> class DepartamentoAdmin(admin.ModelAdmin):
>     list_display = (...)
>     fieldsets = [...]
>     ...
>
>    def save_model(self, request, obj, form, change):
>         if getattr(obj, 'propietario', None) is None:
>             obj.propietario = request.user
>         obj.save()
>
> Con eso el propietario quedará asociado al usuario que guardó el
> departamento.
> Luego puedes evitar que se liste en el formulario de administración
> dejando sin incluir el campo propietario en el atributo fieldsets.
>
> Puedes leer más información sobre reimplementar el método save_model()
> aquí:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contri...

Diego Baulde

unread,
Oct 16, 2020, 7:02:14 PM10/16/20
to Django-es
Hola a todos, disculpen que active la pregunta después de tanto tiempo, pero no pude hacer funcionar ésta solución.
Tengo el siguiente modelo:

class Muestra(models.Model):
   departamento = models.CharField(max_length=45)
   numero = models.PositiveIntegerField()
   tipo_prestacion = models.CharField(max_length=45)
   entrada = models.CharField(max_length=45)

Y en el admin.py esto:

def queryset(self, request):
    fil = super(MuestraAdmin, self).queryset(request)
    fil = fil.filter(departamento=request.user.groups)
    return fil

Logicamente que los nombres de los grupos de los usuarios cuando ingresan un registro automáticamente se coloca en el campo "departamento".
No logro que los filtre que estaré haciendo mal. Uso Django 3.1

Desde ya muchas gracias

carlos

unread,
Oct 16, 2020, 7:31:06 PM10/16/20
to djan...@googlegroups.com
por lo veo y entiendo no te va a funcionar ese filtro ya que 
tienes esto departamento = models.CharField(max_length=45)
es un charfield no un FK hacia user.
o cambias ese campo a un ForeignKey que apunta al modelo de User o no podrás hacer ese filtro
o crear otro campo en el modelo Muestra que apunte hacia User y de ahi haces el filtro.

también recordarte que groups es un M2M así que debes recorrerlo para poder filtrar,
o puedes hacer manualmente ese filtro a ver si departamento es un charfield y tiene un valor de 'Carazo'
podrias poner en queryset algo así
fil = fil.filter(departamento__contains=''Carazo)
y eso te traería solo los registros que en departamento tenga la palabra Carazo

Me imagino que quieres mostrar resultados en el admin por grupo de usuarios?? o que estás pretendiendo hacer?

--
--
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 cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a django-es+...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/django-es/9e7444f8-72a9-45e3-aa73-2e861dfa862cn%40googlegroups.com.


--
att.
Carlos Rocha

Diego Baulde

unread,
Oct 17, 2020, 4:25:57 AM10/17/20
to Django-es
Gracias por la respuesta Carlos, lo que prentendo hacer es que cada vez que un usuario ingrese el sistema automáticamente filtre las "muestras" según el departamento, por lo cual por eso hay un campo departamento en el modelo Muestra. Entonces la intención era armar grupos segun la cantidad de departamentos que tenga, por lo cual a cada usuario tiene asignado un grupo(que sería igual al "departamento"). Entonces la idea en verificar el grupo y según que departamento sea, al ingresar a las muestras si estas tienen en el campo departamento lo mismo, filtrar solo esas.

Desde ya muchas gracias

Alejandro Avendano

unread,
Oct 17, 2020, 6:37:28 AM10/17/20
to djan...@googlegroups.com
Creo que que has debido defininr queryset() como un metodo de la clase Muestra. Si esta en el admin.py nunca sera llamado


--

Francisco del Roio

unread,
Oct 17, 2020, 6:56:32 AM10/17/20
to djan...@googlegroups.com
Hola, buen día,

Podrías probar con algo así:

    def queryset(self, request):

    return
super().queryset().filter(departamento__in=request.user.groups.values_list)'name',flat=True))

Saludos,

--
Cuando tus fuerzas terminan, las de mi Dios comienzan.

OpenPGP_0xCEA123FA3CF5CE77.asc
OpenPGP_signature

Francisco del Roio

unread,
Oct 17, 2020, 7:03:29 AM10/17/20
to djan...@googlegroups.com
Hola denuevo,

Un detalle que se me pasó por alto es que el método a implementar se
llama get_queryset, no queryset solamente.
OpenPGP_0xCEA123FA3CF5CE77.asc
OpenPGP_signature

Diego Baulde

unread,
Oct 18, 2020, 3:52:30 AM10/18/20
to Django-es
Hola muchísimas gracias por las respuestas al final hice una mezcla entre todo lo que me sugirieron y definí la función en el admin.py de ésta manera:

def get_queryset(self, request):
filtro_dpto = super(MuestraAdmin, self).get_queryset(request)
filtro_dpto = filtro_dpto.filter(departamento__in=request.user.groups.values_list('name',flat=True))
return filtro_dpto

Y quedó perfecta para lo que necesitaba.
Ahora tengo un problema con el tema de modificar una tabla intermedia para ingresar datos extra, pero no voy a abusar, intento primero y después cualquier cosa preguntaré jaja.

Un saludo grande a todos, y muchas gracias nuevamente!
Diego
Reply all
Reply to author
Forward
0 new messages