2009-11-30 16 views
22

Quiero agregar un método de conveniencia/modelo al modelo django.contrib.auth.models.User. ¿Cuál es la mejor práctica para hacer esto, ya que, la última vez que lo revisé, la extensión del modelo de Usuario se consideró una mala práctica.¿La mejor manera de agregar métodos de conveniencia a un modelo de usuario de autenticación de Django?

Tengo un modelo personalizado UserProfile personalizado. ¿Debo usar eso para todos los métodos de conveniencia relacionados con el usuario?

Respuesta

29

Depende de lo que intente agregar al modelo. Si desea agregar más información sobre el usuario, entonces se recomienda en general que utiliza el UserProfile método: http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

Sin embargo, si lo que desea es añadir métodos personalizados o gerentes en el modelo User, yo diría que es más lógico utilizar un modelo de proxy, así:

from django.contrib.auth.models import User 

class UserMethods(User): 
    def custom_method(self): 
    pass 
    class Meta: 
    proxy=True 

un modelo proxy operar en la misma tabla de base de datos como el modelo original, lo que es ideal para la creación de métodos personalizados sin extender físicamente el modelo. Simplemente reemplace cualquier referencia a User en sus vistas al UserMethods. (Y, por supuesto, puede utilizar esto en la herramienta de administración de anular el registro del modelo de User y el registro de su modelo de poder en su lugar.)

cualquier instancia del modelo original User que se crean será accesible al instante a través del modelo UserMethods, y viceversa. Más aquí: http://docs.djangoproject.com/en/dev/topics/db/models/#proxy-models

(. NB Los modelos sustitutos requieren Django 1.1 y superior)

+0

¡Buena llamada! Olvidé por completo los modelos Proxy. Estoy ejecutando 1.1, pero estaba pensando en una mentalidad 1.0. – Soviut

+14

¿Existe alguna manera fácil de cambiar el tipo de request.user al tipo de proxy? ¿Es eso necesario, o puedo llamar a los métodos proxy directamente en request.user? – slacy

+2

Tuve la misma duda que @slacy y encontré la manera de responderlo: https://stackoverflow.com/a/11526049/188614. Básicamente, debe subclase django.contrib.auth.backends.ModelBackend, devolver UserMethods en get_user y configurarlo en AUTHENTICATION_BACKENDS. –

4

Sí. No es necesario que te metas con las bases cuando tu modelo de usuario tiene una función .get_profile() adjunta.

+1

+1, no se recomienda ampliar el modelo de usuario, y toda la plomería para perfiles ya está allí para su uso. –

+0

Aparentemente, 'get_profile()' está en desuso. – Flimm

+0

Puede agregar un campo 'OneToOne' en el modelo de perfil y llamar' user_instance.profile' en lugar de usar 'get_profile()'. –

-1

Prefiero usar el mismo perfil de usuario en varios proyectos que desarrollo y extiendo al usuario para cualquier necesidad específica del proyecto. Por lo tanto, la funcionalidad común va a UserProfile, y la funcionalidad específica del proyecto va para el usuario personalizado. No he tenido ningún efecto adverso de tener un modelo de Usuario subclasificado aún, me pregunto si todavía existe alguno con Django 1.0+.

14

si desea agregar métodos personalizados al modelo de usuario, recomendaría monkey_patching:

crear un archivo monkey_patching.py en cualquiera de sus apps ::

#app/monkey_patching.py 
from django.contrib.auth.models import User 

def get_user_name(self): 
    if self.first_name or self.last_name: 
     return self.first_name + " " + self.last_name 
    return self.username 

User.add_to_class("get_user_name",get_user_name) 

e impórtelo en el archivo __init__.py de la aplicación. es decir ::

#app/__init__.py 
import monkey_patching 
Cuestiones relacionadas