2011-07-12 23 views
12

Tengo una aplicación Django que permite diferentes tipos de usuarios: empresas, administradores, personas externas, etc. Por supuesto, todo esto es fácil de administrar con el sistema y los grupos de autenticación predeterminados.Django - Perfiles de usuario de diferentes tipos

Mi problema es que los usuarios que pertenecen a diferentes grupos tendrán información relacionada diferente, por ejemplo, las empresas necesitarán proporcionar cierta información comercial que no tiene sentido para los usuarios privados. Por lo tanto, necesito adjuntar diferentes tipos de perfiles, dependiendo del grupo. (En mi aplicación los grupos son mutuamente excluyentes.)

Desafortunadamente, Django solo permite que se adjunte un solo modelo como perfil, y ese modelo se declara en settings.AUTH_PROFILE_MODULE. Internamente, se recupera mediante el método User.get_profile(), que básicamente solo lee este valor y realiza algunas comprobaciones, por ejemplo, que el modelo realmente existe.

Estaba pensando en hacer una subclase en User y anular el método get_profile(), de modo que devuelve un modelo diferente según el grupo.

Is there a simpler/cleaner way to manage different kind of profiles?

Lo que propongo me parece un pequeño programa, teniendo en cuenta que los perfiles de usuario se introdujeron exactamente para evitar tener que subclase usuario.

Respuesta

16

Cree un modelo con OneToOneField a User y related_name.

Ej .:

class Firm(models.Model): 
    user = models.OneToOneField(User, related_name='firm') 
    # other fields 

class External(models.Model): 
    user = models.OneToOneField(User, related_name='external') 
    # other fields 

A continuación, se puede comprobar la existencia de estos atributos en user (if hasattr(request.user, 'firm')) y volver instancia adecuada. Lo pondría en middleware personalizado, que establecería request.user_profile por ejemplo.

+0

Esto resulta ser la forma más sencilla. Mi problema ahora es garantizar que estos perfiles sean completados por el administrador. http://stackoverflow.com/questions/6681464/django-admin-validating-inlines-together-with-main-models – Andrea

+0

Este modelo de usuario no es una cosa predeterminada que viene con Django ¿verdad? Porque obtengo 'NameError: name 'User' no está definido' cuando pruebo esto –

+1

@JulioMarins Sí, deberías importarlo:' from django.contrib.auth.models import User' – DrTyrsa

Cuestiones relacionadas