Объект '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'
)
` ** Что я пробовал:**
- Промывка и запуск новой БД (так как до этого я использовал встроенную модель пользователя Django и некоторые старые пользователи не справлялись с новым полем типа пользователя).
- Добавление типа пользователя с опцией работодателя по умолчанию в представление работодателя и получение типа пользователя из модели пользователя.
** Что я ожидаю:** Представление профиля должно соединяться с пользовательской моделью пользователя и позволять пользователю добавлять дополнительную информацию в свой профиль пользователя. И, конечно же, страница профиля должна иметь атрибут 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
, но вы можете назвать ее иначе, просто чтобы избежать ошибок.