Для упрощения регистрации и логирования пользователей имеет смысл избавиться от username. Точнее не мучать им пользователя и генерировать его из e-mail. И для логирования соответственно использовать e-mail или сгенерированный username.
Для регистрации без ввода username делаем:
1. Вставляем в код registratiron/forms.py новый класс:
class RegistrationFormNoUserName(RegistrationFormUniqueEmail):
username = forms.CharField(widget=forms.HiddenInput, required=False)
def clean_username(self):
"This function is required to overwrite an inherited username clean"
return self.cleaned_data['username']
def clean(self):
if not self.errors:
localpart = self.cleaned_data['email'].split('@',1)[0][:25]
c = User.objects.filter(username=localpart).count()
if c > 0:
localpart += str(c + 1)
self.cleaned_data['username'] = localpart
2. Заменяем в коде registratiron/views.py:
from registration.forms import RegistrationForm
на
from registration.forms import RegistrationForm, RegistrationFormNoUserName
а также
form_class=RegistrationForm, profile_callback=None,
на
form_class=RegistrationFormNoUserName, profile_callback=None,
3. Перегружаем сервер и проверяем регистрацию.
Для логирования с использованием e-mail вместо username делаем:
1. В settings.py добавляем:
AUTHENTICATION_BACKENDS = (
'yourproject.email-auth.EmailBackend',
)
2. Создаем в корне проекта файл email-auth.py со следующим содержанием:
from django.contrib.auth.models import User
from django.core.validators import email_re
class BasicBackend:
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
class EmailBackend(BasicBackend):
def authenticate(self, username=None, password=None):
#If username is an email address, then try to pull it up
if email_re.search(username):
try:
user = User.objects.get(email=username)
except User.DoesNotExist:
return None
else:
#We have a non-email address username we should try username
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
return None
if user.check_password(password):
return user
3. Перезагружаем сервер и пробуем войти указав e-mail вместо username.
Источники:
P.S. Для нормального отображения названий полей поправить соответствующие шаблоны и файлы локализации. Как делать локализации читаем тут
Комментарии