Объект 'User' не имеет атрибута 'user_type' - проблема модели Django Custom User

Я создал пользовательскую абстрактную модель пользователя и модель профиля для сбора дополнительной информации после регистрации пользователя.

Я собираю "Тип пользователя: Работодатель/сотрудник" во время регистрации, но это, похоже, не распознается в представлении профиля. Несмотря на то, что пользователь правильно добавлен в БД (я проверил через Admin).

Например, я создал пользователя: asus23910 (тип пользователя работодатель). Но когда я вхожу в систему и перенаправляюсь на http://127.0.0.1:8000/employer_profile/asus23910/, я получаю следующую ошибку:

У объекта 'User' нет атрибута 'user_type'C:\Users\ASUS\PycharmProjects\Content\content\content\views.py, строка 112, in employer_profile_view

1. Вот мой код employer_profile_view.py:

def employer_profile_view(request, username):
    user = User.objects.get(username=username)
    if user.user_type != User.EMPLOYER:
        # Redirect to the correct profile page if the user type is not employer
        return redirect('employee_profile', username=request.user.username)

    if request.method == 'POST':
        form = EmployerProfileForm(request.POST, instance=user.employerprofile)
        if form.is_valid():
            employer_profile = form.save(commit=False)
            employer_profile.user = user
            employer_profile.save()
            return redirect('employer_profile', username=request.user.username)
    else:
        form = EmployerProfileForm(instance=user.employerprofile)

    context = {
        'form': form,
        'username': username,
    }
    return render(request, 'employer_profile.html', context)

2. Модель профиля работодателя и соединитель

class EmployerProfile(models.Model):
   user = models.OneToOneField(User, on_delete=models.CASCADE)
   user_type = models.CharField(
        max_length=10,
        choices=User.USER_TYPE_CHOICES,
        default=User.EMPLOYER
    )
   first_name = models.CharField(max_length=255)
   last_name = models.CharField(max_length=255)
   title = models.CharField(max_length=255)
   company_name = models.CharField(max_length=255)
   company_logo = models.ImageField(upload_to='company_logos/')
   company_location = models.CharField(max_length=255)
   company_website = models.URLField()
   company_twitter = models.URLField()


#one-2-one connector
@receiver(post_save, sender=User)
def create_employer_profile(sender, instance, created, **kwargs):
   if created:
       EmployerProfile.objects.create(user=instance, user_type=instance.user_type)
       print('Employer Profile created')


@receiver(post_save, sender=User)
def save_employer_profile(sender, instance, **kwargs):
   instance.employerprofile.user_type = instance.user_type
   instance.employerprofile.save()
   print('Employer Profile saved')

3. Модель пользователя

#model one to store the user into db
class User(AbstractUser):
    EMPLOYER = "employer"
    EMPLOYEE = "employee"
    USER_TYPE_CHOICES = [
        (EMPLOYER, "Employer"),
        (EMPLOYEE, "Employee"),
    ]
    user_type = models.CharField(
        max_length=10,
        choices=USER_TYPE_CHOICES,
        default=EMPLOYEE
    )
    email = models.EmailField(default='example@example.com')
    username = models.CharField(max_length=150, default='example_user')
    password = models.CharField(max_length=128, default='!')
    groups = models.ManyToManyField(
        Group,
        blank=True,
        related_name='content_groups'
    )
    user_permissions = models.ManyToManyField(
        Permission,
        blank=True,
        related_name='content_user_permissions'
    )

` ** Что я пробовал:**

  1. Промывка и запуск новой БД (так как до этого я использовал встроенную модель пользователя Django и некоторые старые пользователи не справлялись с новым полем типа пользователя).
  2. Добавление типа пользователя с опцией работодателя по умолчанию в представление работодателя и получение типа пользователя из модели пользователя.

** Что я ожидаю:** Представление профиля должно соединяться с пользовательской моделью пользователя и позволять пользователю добавлять дополнительную информацию в свой профиль пользователя. И, конечно же, страница профиля должна иметь атрибут user-type, который изначально хранится в классе user.

Вероятно, вы импортируете User не из вашего файла моделей, а из django. В любом случае я настоятельно рекомендую (если вы переписали AUTH_USER_MODEL) использовать встроенный метод get_user_model() из Django, например:

from django.contrib.auth import get_user_model

def employer_profile_view(request, username):
    user = get_user_model().objects.get(username=username)
    if user.user_type != User.EMPLOYER:
    ...

И не используйте имя User для модели, я сам предпочитаю использовать CustomUser, но вы можете назвать ее иначе, просто чтобы избежать ошибок.

Вернуться на верх