2009-05-22 14 views
11

El valor predeterminado modelo de Django User tiene algunos campos, y reglas de validación, que realmente no necesita. Quiero que el registro sea lo más simple posible, es decir, requiera correo electrónico o nombre de usuario, o número de teléfono, todos ellos únicos, por lo tanto, como identificadores de usuario.¿Cómo cambiar el modelo de usuario predeterminado de django para que se ajuste a mis necesidades?

Tampoco me gusta el juego de caracteres predeterminado para el nombre de usuario que se valida en el modelo de usuario de Django. Me gustaría permitir que cualquier personaje allí, ¿por qué no?

Utilicé la aplicación django de perfil de usuario antes para agregar un perfil al usuario, pero esta vez prefiero que la clase sea mímima. Pero todavía quiero usar la clase User, ya que me da una manera fácil de tener partes del sitio restringidas solo para los usuarios que inician sesión.

¿Cómo lo hago?

Respuesta

8

En lugar de modificar la clase de usuario directamente o hacer subclases, también puede simplemente reutilizar los campos existentes.

Para un sitio utilicé el campo "first_name" como el "nombre mostrado públicamente" de un usuario y rellené una versión reducida de eso en el campo "username" (para usar en URLs). Escribí un back-end de autenticación personalizado para permitir que las personas inicien sesión usando su "nombre público" o su dirección de correo electrónico, y hago cumplir la singularidad de ambos en el momento del registro. Esto funciona muy bien con otras aplicaciones reutilizables y no presenta tablas o consultas adicionales.

Para otro sitio no quería ningún nombre de usuario, solo correos electrónicos únicos. Con el fin de satisfacer la necesidad de Django de un nombre de usuario único, simplemente puse el hash en la dirección de correo electrónico y la utilicé como nombre de usuario (tienes que codificar en base64 el hash para exprimirlo en 30 caracteres). Back-end de autenticación personalizada para permitir el inicio de sesión con correo electrónico.

Si la compatibilidad con versiones anteriores no fuera un problema, hay muchas mejoras que me gustaría ver realizadas en django.contrib.auth y el modelo de usuario para hacerlas más flexibles. Pero hay muchas cosas que puedes hacer dentro de las limitaciones actuales con un poco de creatividad.

+0

¿Alguna idea de cómo crear el back-end de autenticación para iniciar sesión con el correo electrónico? – kender

+0

Echa un vistazo a este fragmento para que comiences: http://www.djangosnippets.org/snippets/74/ Asegúrate de leer los comentarios, ya que el código en el segundo comentario es mejor que el que aparece en el fragmento, y un montón de otros temas relevantes se plantean en los comentarios que querrá tener en cuenta. –

7

El modelo de usuario de Django está estructurado de manera muy sensata. Realmente no desea permitir caracteres arbitrarios en un nombre de usuario, por ejemplo, y hay formas de lograr email address login, sin hackear los cambios en el modelo base.

Para almacenar simplemente información adicional alrededor de una cuenta de usuario, Django admite la noción de perfiles de usuario. Si bien no necesita confiar en el soporte integrado para manejar esto, es una convención que se sigue comúnmente y que le permitirá jugar bien con las aplicaciones de Django reutilizables que están flotando en el éter. Para obtener más información, consulte here.

Si realmente quiere modificar el modelo de usuario central pero también "jugar bien" con aplicaciones reutilizables que dependen de él, está abriendo un poco de una caja de Pandora. Los desarrolladores hacen suposiciones básicas sobre cómo está estructurada la biblioteca central, por lo que cualquier cambio puede causar una ruptura inesperada. No obstante, puede hacer cambios en el parche de monopatín al modelo base, o ramificar una copia de Django localmente. Disuadiría a este último, y solo recomendaría el primero si sabes lo que estás haciendo.

+6

El modelo de usuario de Django está estructurado "sensiblemente", ya que si estuviera construyendo un sitio, sería un modelo de Usuario razonable para un conjunto particular de necesidades. Pero como la abstracción de usuario central para un marco, deja cierta flexibilidad que desear. –

+2

Estoy de acuerdo en que un sistema de autenticación más conectable sería deseable –

7

He leído mal la pregunta. Espero que esta publicación sea útil para cualquier otra persona.

#in models.py 
from django.db.models.signals import post_save 

class UserProfile(models.Model): 
    user = models.ForeignKey(User) 
    #other fields here 

    def __str__(self): 
      return "%s's profile" % self.user 

    def create_user_profile(sender, instance, created, **kwargs): 
     if created: 
      profile, created = UserProfile.objects.get_or_create(user=instance) 

post_save.connect(create_user_profile, sender=User) 

#in settings.py 
AUTH_PROFILE_MODULE = 'YOURAPP.UserProfile' 

Esto creará un perfil de usuario cada vez que un usuario se guarda si se crea. continuación, puede utilizar

user.get_profile().whatever 

Aquí hay más información a partir de los documentos

http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

0

se enfrentan a un poco de un dilema que realmente tiene dos soluciones si usted está comprometido a evitar el perfil personalización basada en datos ya señalado.

  1. cambiar el modelo User sí, por sugerencia de Daniel
  2. escribir una clase CustomUser, la subclasificación User o inserta su funcionalidad.

La última sugerencia significa que usted tendría que poner en práctica algunas cosas que User automáticamente hace manualmente, pero me pregunto si eso es tan malo como parece, sobre todo si estás en el inicio de su proyecto. Todo lo que tendrías que hacer es reescribir una clase de middleware y algunos decoradores.

Por supuesto, no creo que esto te compre algo que no te va a conseguir, excepto que tu proyecto no debería romperse si svn update tu django. Puede evitar algunos de los problemas de compatibilidad con otras aplicaciones, pero creo que la mayoría de los problemas existirán de cualquier manera.

0

Hay varias maneras de hacerlo, pero esto es lo que haría: permitiría que un usuario ingrese un correo electrónico, nombre de usuario (que debe contener al menos una letra y no @ símbolos) o número de móvil. Luego, cuando lo valide:

  1. Compruebe la presencia de @. Si es así, configúrelo como el correo electrónico del usuario, configúrelo como su nombre de usuario.
  2. Compruebe si solo son números, guiones y +. Luego, quite los caracteres apropiados y guárdelo como número de móvil y nombre de usuario (si está almacenando el número de teléfono móvil en otro modelo para fines de SMS o algo así).
  3. Si no lo es, simplemente configúrelo como nombre de usuario.

También validaría el campo usuario/teléfono/correo electrónico de manera similar al iniciar sesión y buscar en el lugar apropiado para que, por ejemplo, un usuario se registre con su número de móvil y luego cambie su nombre de usuario (para otro propósito), todavía pueden iniciar sesión con su número de teléfono móvil.

Cuestiones relacionadas