Django-registration. Регистрация и логирование по e-mail

5370 0

Для упрощения регистрации и логирования пользователей имеет смысл избавиться от 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.


Источники:     Django Registration without username и Use email addresses for user name

 

P.S.  Для нормального отображения названий полей поправить соответствующие шаблоны и файлы локализации. Как делать локализации читаем тут 

Комментарии

Контактные данные

 Россия, г. Москва