2

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'

カスタム ユーザーを認証するにはどうすればよいですか?

4

2 に答える 2

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 の「カスタム ユーザー」の実装は忌まわしいものです。

于 2013-05-22T11:15:03.390 に答える
1

Djangoのドキュメントが言っていることは

Django の User モデルに完全に満足していて、追加のプロファイル情報を追加したい場合は、単純に django.contrib.auth.models.AbstractUser をサブクラス化し、カスタム プロファイル フィールドを追加できます。

したがって、AbstractUser の考え方は、Django 1.5 以前のように別の db テーブルを作成せずに、ユーザー モデルにいくつかの追加フィールドを追加する必要がある場合にのみ使用することです。

ただし、別の機能が必要な場合 (電子メールをユーザー名として使用するなど、おそらくユーザー名フィールドは必要ないことを意味します)、AbstractBaseUser クラスを拡張し、必要なすべてのフィールドを設定することをお勧めします。このように設定すると、USERNAME_FIELD='email'カスタム create_user() メソッドを記述しなくても機能します。

于 2013-05-23T09:21:48.167 に答える