在Django 1.5中将用户名设置为电子邮件 [英] Set email as username in Django 1.5

查看:121
本文介绍了在Django 1.5中将用户名设置为电子邮件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在阅读文档: https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#substituting-a-custom-user-model

所以在我的settings.py我把:

So in my settings.py I put:

AUTH_USER_MODEL = 'membership.User'

在我的会员资格模型.py.py中我有这样的:

And in my membership app models.py I have this:

from django.contrib.auth.models import AbstractBaseUser

class User(AbstractBaseUser):
    USERNAME_FIELD = 'email'

运行python manage.py syncdb正在给我:

Running python manage.py syncdb is giving me:

FieldDoesNotExist: User has no field named 'email'

我检查AbstractBaseUser类源,当然可以这样定义: https://github.com/django/django/blob/master/django/contrib/auth/models.py#L359

I check AbstractBaseUser class source and the field is defined of course, as you can see here: https://github.com/django/django/blob/master/django/contrib/auth/models.py#L359

什么是

推荐答案

AbstractBaseUser 没有电子邮件字段, code> AbstractUser 。

AbstractBaseUser doesn't have email field, the AbstractUser does.

如果要使用电子邮件作为唯一标识符,则需要从AbstractBaseUser中子类化并定义电子邮件字段与 unique = True ,还可以编写其他功能,例如 Manager

If you want to use email as a unique identifier, then you need to subclass from AbstractBaseUser and define email field with unique=True and also write other functionality, for example Manager of the model:

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager,\
    PermissionsMixin
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
from django.utils.http import urlquote


class CustomUserManager(BaseUserManager):

    def create_user(self, email, password=None, **extra_fields):
        """
        Creates and saves a User with the given email and password.
        """
        now = timezone.now()
        if not email:
            raise ValueError('The given email must be set')
        email = CustomUserManager.normalize_email(email)
        user = self.model(email=email,
                          is_staff=False, is_active=True, is_superuser=False,
                          last_login=now, date_joined=now, **extra_fields)

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

    def create_superuser(self, email, password, **extra_fields):
        u = self.create_user(email, password, **extra_fields)
        u.is_staff = True
        u.is_active = True
        u.is_superuser = True
        u.save(using=self._db)
        return u


class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), unique=True)
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=30, blank=True)
    is_staff = models.BooleanField(_('staff status'), default=False,
        help_text=_('Designates whether the user can log into this admin '
                    'site.'))
    is_active = models.BooleanField(_('active'), default=True,
        help_text=_('Designates whether this user should be treated as '
                    'active. Unselect this instead of deleting accounts.'))
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

    def get_absolute_url(self):
        return "/users/%s/" % urlquote(self.pk)

    def get_full_name(self):
        """
        Returns the first_name plus the last_name, with a space in between.
        """
        full_name = '%s %s' % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        "Returns the short name for the user."
        return self.first_name

    # define here other needed methods
    # Look at django.contrib.auth.models.AbstractUser

此外,您可能希望将此用户添加到管理页面。请查看 UserAdmin 并重新定义为与新用户兼容模型,使用电子邮件字段作为唯一标识符。

Also, you'll probably want to add this user to admin page. Look at UserAdmin and redefine it to be compatible with new user model, that use email field as unique identifier.

这篇关于在Django 1.5中将用户名设置为电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆