2012-01-25 19 views
7

Me encantaría tener permisos más granulares en mi proyecto Django, pero no puedo decidir qué aplicación usar. Lo que tengo es algo así como:Django permisos

class Item(models.Model): 
    name = models.CharField(max_length=64, unique=True) 
    description = models.CharField(max_length=128, default='') 
    logo = ImageField(upload_to=/tmp, blank=True, null=True) 

Ahora con permisos estándar de Django tengo la posibilidad de elegir entre añadir, modificar y borrar, lo que quiere tener es un permiso de cambio prolongado, para ofrecer la capacidad de dar derechos grupales solo para cambiar el logotipo, por ejemplo, pero no permitir que ese mismo grupo modifique la descripción del artículo. No quiero o no necesito una relación de entrada de usuario, simplemente le doy la posibilidad a diferentes grupos de editar campos individuales de un modelo usando la interfaz de administración estándar. Ni siquiera estoy seguro de si estoy hablando de permiso por objeto.

¿Alguien sabe lo que es mejor usar o cómo lo implementaría yo mismo? También podría imaginar tener usuarios de solo lectura que puedan acceder/leer todo pero que no podrán modificar, esto tampoco es posible.

Gracias por cualquier ayuda.

+0

No, estos no son permisos a nivel de objeto. Respuesta corta: podría ser factible, pero es un montón de código. Respuesta larga: no puedes hacer lo que estás describiendo en un administrador de vanjan django. Un enfoque sería conectar ModelAdmins por separado con los campos relevantes habilitados para separar las instancias de AdminSite. Creo que es probable que tenga que subclasificar a AdminSite para compararlo con sus grupos y codificar los permisos que tiene cada grupo: los permisos incorporados de django no tienen un concepto de campos permitidos/no permitidos. – AdamKG

+0

Muchas gracias por la respuesta esperada y la confirmación.Esperaré implementar diferentes subclases de AdminSite para lograr mi tarea. – tinti

Respuesta

7

El más flexible, pero manera sería:

  1. escribir algunos custom permissions (es decir can_modify_descr)
  2. escribir yur propios puntos de vista o FormsModelForms
  3. de escritura para prestar sus formas especificadas.
  4. Finalmente, tendría que override some django admin templates y presentar sus Formularios en plantillas que extend some standard django admin templates.

Por lo que puedo ver, esta es la única forma de lograr lo que desea, pero también requiere mucho trabajo.

+0

Gracias, puedes hacerlo también de la manera descrita por AdamKG. De esta manera es mucho más fácil, ya que no tiene vistas personalizadas y plantillas correspondientes. – tinti

1

Una manera simple de lograr eso es crear muchos ModelAdmin para el mismo modelo (uno para cada "grupo"). Para ello es necesario crear una Proxy Models para cada "grupo" de esta manera:

models.py

class Item(models.Model): 
    name = models.CharField(max_length=64, unique=True) 
    description = models.CharField(max_length=128, default='') 
    logo = ImageField(upload_to=/tmp, blank=True, null=True) 

class ItemGroup1(Item): 
    class Meta: 
     proxy = True 

admin.py

class ItemAdmin(models.ModelAdmin): 
    ... 

class ItemGroup1Admin(models.ModelAdmin): 
    readonly_fields = ('logo', 'description') 

Y a continuación, sólo tiene para establecer los permisos del grupo 1 para que solo tenga acceso a ItemGroup1, etc.

Consulte esta publicación para obtener más información: Using Proxy Models to Customize the Django Admin

0

Si desea manejar este tipo de cosas más allá de su sitio de administración, consulte django-logical-rules, donde puede escribir sus reglas en python y acceder a ellas desde vistas o dentro de una plantilla ;

Cuestiones relacionadas