Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

396
Vistas
¿Cómo configurar los permisos de Django para que sean específicos para las instancias de un determinado modelo?

Considere una aplicación simple de Django que contenga un modelo central llamado Project . Otros recursos de esta aplicación siempre están vinculados a un Project específico.

Código ejemplar:

 class Project(models.Model): pass class Page(models.Model): project = models.ForeignKey(Project)

Me gustaría aprovechar el sistema de permisos de Django para establecer permisos granulares por proyecto existente . En el caso del ejemplo, un usuario debería poder tener un permiso view_page para algunas instancias del proyecto y no tenerlo para otras.

Al final, me gustaría tener una función como has_perm que tome el nombre en clave del permiso y un proyecto como entrada y devuelva True si el usuario actual tiene el permiso en el proyecto dado.

¿Hay alguna manera de extender o reemplazar el sistema de autorización de Django para lograr algo como esto?

Podría extender el modelo de Group del usuario para incluir un enlace a Project y verificar tanto el proyecto del grupo como sus permisos. Pero eso no es elegante y no permite asignar permisos a usuarios individuales.


Algunas preguntas relacionadas en el foro de Django se pueden encontrar aquí:

  • Autorización sobre conjuntos de recursos
  • ¿Cómo está manejando los permisos de usuario en proyectos más complejos?

Preguntas relacionadas con StackOverflow:

  • Permisos de Django a través de permisos de objetos relacionados
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Mi respuesta se a user should be able to have a view_page permission for one project instance, and don't have it for another instance.

Entonces, básicamente, tendrá que capturar first user visit == first model instance , puede crear FirstVisit model que capturará y guardará cada primera instancia usando url , user.id y page.id , luego verificará si existe.

 # model class Project(models.Model): pass class Page(models.Model): project = models.ForeignKey(Project) class FirstVisit(models.Model): url = models.URLField() user = models.ForeignKey(User) page = models.ForeignKey(Page) #views.py def my_view(request): if not FisrtVisit.objects.filter(user=request.user.id, url=request.path, page=request.page.id).exists(): # first time visit == first instance #your code... FisrtVisit(user=request.user, url=request.path, page=request.page.id).save()

basado en esta solución

Sugiero usar la dirección Mac del dispositivo (computadora o teléfono inteligente) en lugar de la URL usando getmac para verificar la primera visita al máximo

over 4 years ago · Santiago Trujillo Denunciar

0

Respuesta original: use django-guardian

Editar Como se discutió en los comentarios, creo que django-guardian ofrece la forma más fácil y limpia de lograr esto. Sin embargo, otra solución es crear un usuario personalizado.

  1. Cree un modelo de usuario personalizado. cómo
  2. Anule el método has_perm en su nuevo modelo de usuario.
 from django.db import models from my_app import Project class CustomUser(...) projects = models.ManyToManyField(Project) def has_perm(self, perm, obj=None): if isinstance(obj, Project): if not obj in self.projects.objects.all(): return False return super().has_perm(perm, obj)
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda