2010-08-23 11 views
18

Bueno, este es bastante obvio para todos los que usan Django y los novatos suelen preguntarlo, pero me gustaría dejarlo en claro y analizar si hay otras formas de hacerlo. El método más extendido y conveniente ahora es almacenar correo electrónico en el campo nombre de usuario como Django 1.2 permite "@", "_" y "-" caracteres, pero de esta manera tiene las siguientes cuestiones:Correo electrónico como nombre de usuario en Django

  1. la peor de todas: campo de nombre de usuario está restringido por la propiedad max_length=30, que es ridículamente pequeña para los correos electrónicos. Incluso si anula la validación de formulario, DB tendrá varchar(30) en lugar de EmailFieldvarchar(75) a menos que modifique su tabla manualmente.
  2. Necesita almacenar sus datos de correo electrónico tanto en el nombre de usuario como en el campo de correo electrónico para que User.email_user() funcione. Creo que hay otros lugares cuando se usa User.email.
  3. Error de lectura del código. Claro, otros djangonautas saben acerca de esta trampa, pero tratar el campo llamado 'nombre de usuario' (especialmente cuando todavía hay un campo de correo electrónico) como el correo electrónico obviamente hace que tu código sea menos comprensible.

El otro enfoque podría ser la autenticación mediante email campo pasando en su sistema backend de autenticación como tal, pero todavía tiene problemas:

authenticate(self, email=None, password=None) 
  1. User.email no tiene unique=True propiedad, lo que significa que su base de datos no tendrá índice, lo que hace que sus búsquedas por correo electrónico sean lentas.
  2. Tiene que tratar con el campo username, que tiene unique=True, quitándolo completamente de su tabla o alterándolo para permitir NULL y eliminando el índice.

Reanudando, ambos caminos son malos y requieren que el código específico de DB se ejecute después de syncdb, lo cual es inaceptable si necesita una aplicación independiente de DB.

+0

Pregunta interesante, me gustaría saber cómo usar los correos electrónicos como nombres de usuario en Django también ;-) – gruszczy

Respuesta

5

He empacado django-email-as-username que debería hacer prácticamente todo lo que necesita si está buscando eliminar nombres de usuario, y solo usar correos electrónicos.

El breve resumen es:

  1. Proporciona una autenticación de correo electrónico y funciones de back-end de ayuda para la creación de usuarios.
  2. Parchea el administrador de Django para manejar la autenticación de usuario basada en correo electrónico.
  3. Se reemplaza el comando createsuperuser para crear usuarios solo con correo electrónico.
  4. Trata la autenticación de correo electrónico como no sensible a mayúsculas y minúsculas.

Bajo los nombres de usuario de campana son versiones de los mensajes de correo electrónico, lo que termina lo que significa que no está limitado a límite de carbón nombre de usuario 30 del Django algoritmo hash (Sólo el correo electrónico regular 75 límite de carbón.)

Editar : A partir de Django 1.5, debe considerar el uso de un modelo de usuario personalizado en lugar del paquete 'django-email-as-username'.

0

Bueno, no he tenido que usar correos electrónicos como nombres de usuario en Django, pero supongo que podría crear un modelo de perfil de usuario y agregarle campos, como otro campo de correo electrónico y hacerlo único. Entonces puede hacer user.get_profile(). Correo electrónico para su autenticación.

Supongo que otro camino a seguir sería heredar el usuario y redefinir los campos, pero creo que esto aún no es recomendado por los desarrolladores de Django.

Finalmente, puede definir su propio modelo de usuario personalizado y volver al django.contrib.auth.models.User para obtener un poco de lógica.

Código de alterar la tabla de usuario dentro de Django:

from django.db import connection 
cursor = connection.cursor() 
cursor.execute("ALTER TABLE auth_user MODIFY COLUMN username varchar(75) NOT NULL") 
+0

Lo malo con la herencia de múltiples tablas o la modificación de la copia local de la aplicación de autenticación es que no hay forma de definir qué modelo debería otras aplicaciones contrib como administración, mensajes o comentarios. –

+0

Entiendo. Supongo que agregar un nuevo campo a UserProfile es la mejor manera de hacerlo si no quieres seguir la opción 1. No estoy seguro, si hay otro enfoque para esto en este momento. – maraujop

+0

Otra cosa que podría hacer si quiere ser un poco más independiente de la base de datos es agregar este código (respuesta editada), con una variable en su settings.py para indicar si debe ejecutarse o si ya está modificado. – maraujop

5

David Cramer se le ocurrió una solución a este problema que amo. Actualmente lo estoy usando en un sitio de producción donde el usuario tiene que poder iniciar sesión usando su correo electrónico O su nombre de usuario. Lo puedes encontrar aquí:

Logging In With Email Addresses in Django

Si el nombre de usuario proporcionado en el formulario es un correo electrónico (contiene el símbolo '@'), intentará autenticarse con eso, y volverá a caer en el nombre de usuario si no es un correo electrónico (Naturalmente, solo necesita asegurarse de que su formulario de registro capture un correo electrónico para este trabajo.)

Cuestiones relacionadas