ユーザー名を使用してユーザーにログインさせる必要はありません。メールのみ。カスタムユーザーモデル用に電子メールでログインする適切な方法は何ですか?
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField('email address', unique=True)
accepted = models.BooleanField('status', default=False)
is_staff = models.BooleanField(
'staff status',
default=False,
help_text='Designates whether the user can log into this 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.',
)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = MyUserManager()
class Meta:
verbose_name = 'user'
verbose_name_plural = 'users'
def __str__(self):
return self.email
def get_full_name(self):
return self.email
def get_short_name(self):
return self.email
カスタムマネージャー:
class MyUserManager(BaseUserManager):
def _create_user(self, email, password, **extra_fields):
if not email:
raise ValueError('The Email must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_active', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self._create_user(email, password, **extra_fields)
そして、私は、ログインテンプレートをレンダリングするauth_views.login
メソッドを使用しています は、だから私は、カスタムユーザモデルを持っています。 テンプレートには、email
とpassword
の2つの入力フィールドがあります。
私がフォームを送信すると、ユーザー名フィールドが必要であるという検証エラーが表示されます。
auth_views.login
は、フィールドが設定されているAuthenticationForm
を使用していることがわかりました。
class MyAuthForm(AuthenticationForm):
username = forms.EmailField()
url(r'^login/$', auth_views.login, {'authentication_form': MyAuthForm}, name='login')
そして、私は、電子メールフィールドに名前としてusername
使用したテンプレートで:だから私は、このフォームをオーバーライドし、ビューに渡すことにしました。それは悪臭を覚える。
私の質問はメールで正しくログインする実装ですか?そうでない場合は、適切な方法は何ですか?
アップデート:このすべての目的は、ユーザーが自分の電子メールでログインできるようにする場合には設定
AUTH_USER_MODEL = 'users.User'
LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = 'base:home'
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
)
これは、あなたの質問への答えではありませんが、そのような – Selcuk
ができジャンゴ・allauthとして、代わりに自分自身を書くの第三者認証システムを使用する方が簡単ですプロジェクトから 'settings.py'を共有します(資格情報なし)? –
@AbbasovAlexander、done – belek