在Django 1.5中验证自定义用户 [英] Authenticating a custom user in Django 1.5

查看:129
本文介绍了在Django 1.5中验证自定义用户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在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)
登录(请求,auth_user)

我得到这个:

 追溯:
文件/ Users / user / dev / proj / app /core/views.py在post
39. login(request,auth_user)
文件/Users/user/.virtualenvs/proj/lib/python2.7/site-packages/django/contrib /auth/__init__.py在登录
92. request.session [BACKEND_SESSION_KEY] = user.backend
文件/Users/user/.vi内部
203中的rtualenvs / proj / lib / python2.7 / site-packages / django / utils / functional.py返回func(self._wrapped,* args)

异常类型:/ signup中的AttributeError
异常值:'AnonymousUser'对象没有属性'后端'

我应该如何认证自定义用户?

解决方案

我的自定义模型没有实现 create_user ()在其明显需要的自定义管理器中。



以下是完整的工作代码:



import $ J $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ password password password password password password password password password password password password password password password password password password password password password password password password password password password password password password password password password password password password password =无):
如果不是电子邮件:
raise ValueError('用户必须有一个电子邮件地址')

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


user.set_p
user.save(using = self._db)
返回用户

def create_superuser(self,email,password):
user = self。 create_user(email,
password = password,

user.is_admin = True
user.save(using = self._db)
返回用户


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

objects = MyUserManager()

USERNAME_FIELD ='电子邮件'

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

Django 1.5自定义用户的实现是可憎的。


I have a custom user in a Django 1.5 project, which uses the email field as the username:

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')

If I try to authenticate that user like so:

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

I get this:

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'

How am I supposed to authenticate a custom user?

解决方案

My custom model didn't implement create_user() in its apparently-required custom manager.

Here's the full working code:

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 "custom user" implementation is an abomination.

这篇关于在Django 1.5中验证自定义用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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