2013-05-22 6 views
2

У меня есть пользовательский пользователь в проекте Django 1.5, который использует email поле в качестве имени пользователя:аутентификации пользовательского пользователя в Django 1.5

class MyUser(AbstractUser): 
    my_custom_field = models.CharField(max_length=20, blank=True, null=True) 

    USERNAME_FIELD = 'email' 

MyUser._meta.get_field_by_name('email')[0]._unique = True 
MyUser.REQUIRED_FIELDS.remove('email') 

Если я пытаюсь проверить подлинность этого пользователя, как так:

auth_user = authenticate(username=email, password=password) 
login(request, auth_user) 

я получаю это:

Traceback: 
File "/Users/user/dev/proj/app/core/views.py" in post 
    39.    login(request, auth_user) 
File "/Users/user/.virtualenvs/proj/lib/python2.7/site-packages/django/contrib/auth/__init__.py" in login 
    92.  request.session[BACKEND_SESSION_KEY] = user.backend 
File "/Users/user/.virtualenvs/proj/lib/python2.7/site-packages/django/utils/functional.py" in inner 
    203.   return func(self._wrapped, *args) 

Exception Type: AttributeError at /signup 
Exception Value: 'AnonymousUser' object has no attribute 'backend' 

Как я должен проверить подлинность пользовательского пользователя?

+0

Я имел в виду это 'AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend')' –

+0

Вы установили 'AUTH_USER_MODEL'? –

+0

'authenticate', похоже, не возвращает фактического пользователя. Это стандартный метод из django.contrib.auth? Вы уверены, что правильный адрес электронной почты и пароль? –

ответ

4

Моя пользовательская модель не реализовала create_user() в своем явно требуемом пользовательском менеджере.

Вот полный рабочий код:

from django.contrib.auth.models import AbstractUser, BaseUserManager 

class MyUserManager(BaseUserManager): 
    def create_user(self, email, password=None): 
     if not email: 
      raise ValueError('Users must have an email address') 

     user = self.model(
      email=MyUserManager.normalize_email(email), 
     ) 

     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, email, password): 
     user = self.create_user(email, 
      password=password, 
     ) 
     user.is_admin = True 
     user.save(using=self._db) 
     return user 


class MyUser(AbstractUser): 
    some_custom_field = models.CharField(max_length=20, blank=True, null=True) 

    objects = MyUserManager() 

    USERNAME_FIELD = 'email' 

MyUser._meta.get_field_by_name('email')[0]._unique = True 
MyUser.REQUIRED_FIELDS.remove('email') 

Django 1.5 Реализация "пользовательских пользователь" Мерзость.

1

Что Джанго документация высказывание

Если вы полностью довольны моделью пользователя Django, и вы просто хотите, чтобы добавить дополнительную информацию о профиле, вы можете просто подкласс django.contrib.auth.models.AbstractUser и добавить свои собственные поля профиля

Так что идея AbstractUser это использовать его только тогда, когда вам нужно добавить несколько дополнительных полей в пользовательской модели без создания отдельной таблицы БД, как это было предварительно Django 1.5.

Но если вам нужна другая функциональность (например, использование имени пользователя в качестве имени пользователя, что, вероятно, означает, что вам не понадобится поле имени пользователя), лучшим подходом является расширение класса AbstractBaseUser и установка всех полей, которые вам нужны. Таким образом, установка USERNAME_FIELD='email' будет работать без написания собственного метода create_user().

Смежные вопросы