password - ¿La mejor manera de agregar métodos de conveniencia a un modelo de usuario de autenticación de Django?
login url django (5)
Actualización 2013:
en 1.5 puede sustituir un modelo de Usuario personalizado y agregar lo que quiera https://docs.djangoproject.com/en/dev/topics/auth/customizing/#auth-custom-user
Deseo 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.
Tengo un modelo de UserProfile
personalizado por separado. ¿Debo usar eso para todos los métodos de conveniencia relacionados con el usuario?
Depende de lo que intentes agregar al modelo. Si desea agregar más información sobre el usuario, generalmente se recomienda que use el método UserProfile
: http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
Sin embargo, si solo desea agregar métodos o administradores personalizados al modelo de User
, yo diría que es más lógico usar 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 funcionará en la misma tabla de base de datos que el modelo original, por lo que es ideal para crear métodos personalizados sin extender físicamente el modelo. Simplemente reemplace cualquier referencia al User
en sus vistas a UserMethods
. (Y, por supuesto, puede usar esto en la herramienta de administración anulando el registro del modelo de User
y registrando su modelo de proxy en su lugar).
Cualquier instancia del modelo de User
original que se cree será instantáneamente accesible a través del modelo de UserMethods
, y viceversa. Más aquí: http://docs.djangoproject.com/en/dev/topics/db/models/#proxy-models
(NB: los modelos Proxy requieren Django 1.1 y superior)
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+.
Sí. No es necesario que te metas con las bases cuando tu modelo de usuario tiene una función .get_profile () adjunta.
si desea agregar métodos personalizados al modelo de usuario, recomendaría monkey_patching :
crea un archivo monkey_patching.py
en cualquiera de tus 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 importarlo en el archivo __init__.py
la aplicación. es decir::
#app/__init__.py
import monkey_patching