Django allauth-django Тип исключения: KeyError в /accounts/signup/ Значение исключения: 'username'
Я пытаюсь реализовать пользовательскую модель пользователя для allauth-django, а также добавить пользовательскую форму и другие атрибуты. Я получаю ошибку, когда добавляю поле 'username' в класс формы, чтобы я мог его стилизовать. Я также изменил allauth login на использование электронной почты вместо имени пользователя, так что имя пользователя будет использоваться только для отображения. Есть идеи, что я делаю не так?
setting.py
SITE_ID = 1
AUTH_USER_MODEL = "xmain.User"
ACCOUNT_USER_MODEL_USERNAME_FIELD = "username"
ACCOUNT_USER_MODEL_EMAIL_FIELD = "email"
AUTHENTICATION_BACKENDS = [
# Needed to login by username in Django admin, regardless of `allauth`
'django.contrib.auth.backends.ModelBackend',
# `allauth` specific authentication methods, such as login by e-mail
'allauth.account.auth_backends.AuthenticationBackend',
]
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_VERIFICATION = True
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_AUTHENTICATION_METHOD = "email"
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_USER_MODEL_USERNAME_FIELD = "username"
ACCOUNT_SIGNUP_REDIRECT_URL ="settings.LOGIN_REDIRECT_URL"
ACCOUNT_USERNAME_BLACKLIST = ["admin","user"]
ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = True
ACCOUNT_LOGIN_ATTEMPTS_LIMIT = 10
ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT = 1800
ACCOUNT_PASSWORD_MIN_LENGTH = 8
ACCOUNT_DEFAULT_HTTP_PROTOCOL = "https"
ACCOUNT_LOGIN_ON_PASSWORD_RESET = True
SOCIALACCOUNT_AUTO_SIGNUP = False
ACCOUNT_FORMS = {
'login': 'xmain.forms.xMainLoginForm',
'signup': 'xmain.forms.xMainRegisterForm',
}
# Password validation
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
models.py
from django.contrib.auth.models import (
BaseUserManager, AbstractBaseUser, PermissionsMixin
)
from django.db import models
# Create your models here.
class UserManager(BaseUserManager):
def create_user(self, email, password=None):
if not email:
raise ValueError("Users must have an email address.")
user = self.model(email=self.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_superuser = True
user.is_staff = True
user.save(using=self._db)
return user
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(verbose_name='email address',unique=True,db_index=True,)
first_name = models.CharField(max_length=191,blank=True,)
last_name = models.CharField(max_length=191,blank=True,)
username = models.CharField(max_length=191,unique=True,)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
address = models.CharField(max_length=200, null=True, blank=True)
objects = UserManager()
USERNAME_FIELD = "email"
def get_first_name(self):
return self.first_name
def get_last_name(self):
return self.last_name
def get_username(self):
return self.username
def __str__(self):
return f"{self.email} ({self.username})"
forms.py
from django.contrib.auth.models import (
BaseUserManager, AbstractBaseUser, PermissionsMixin
)
from django.db import models
# Create your models here.
class UserManager(BaseUserManager):
def create_user(self, email, password=None):
if not email:
raise ValueError("Users must have an email address.")
user = self.model(email=self.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_superuser = True
user.is_staff = True
user.save(using=self._db)
return user
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(verbose_name='email address',unique=True,db_index=True,)
first_name = models.CharField(max_length=191,blank=True,)
last_name = models.CharField(max_length=191,blank=True,)
username = models.CharField(max_length=191,unique=True,)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
address = models.CharField(max_length=200, null=True, blank=True)
objects = UserManager()
USERNAME_FIELD = "email"
def get_first_name(self):
return self.first_name
def get_last_name(self):
return self.last_name
def get_username(self):
return self.username
def __str__(self):
return f"{self.email} ({self.username})"
в шаблоне я просто использую их для отображения поля
{{ form.first_name }}
{{ form.last_name }}
{{ form.username }}
{{ form.email }}