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 }}
Вернуться на верх