У меня есть эта форма регистрации, где я беру у пользователя значения относительно его имени пользователя и пароля, а также его профиля. Я отдельно создал две формы UserForm
и ProfileForm
. Когда пользователь регистрируется в своей учетной записи, как мне подключить профиль к пользователю.
Вот что у меня есть
forms.py
class SignUpForm(UserCreationForm):
email = forms.EmailField(required=True,
label='Email',
error_messages={'exists': 'Oops'})
class Meta:
model = User
fields = ("username", "email", "password1", "password2")
def save(self, commit=True):
user = super(SignUpForm, self).save(commit=False)
user.email = self.cleaned_data["email"]
# user.status = self.cleaned_data["status"]
if commit:
user.save()
return user
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['contact', 'whatsapp', 'gender', 'avatar']
models.py
class Profile(models.Model):
STATUS_CHOICES = (
(1, ("Permanent")),
(2, ("Temporary")),
(3, ("Contractor")),
(4, ("Intern"))
)
GENDER_CHOICES = (
(1, ("Male")),
(2, ("Female")),
(3, ("Not Specified"))
)
PAY_CHOICES = (
(1, ("Fixed")),
(2, ("Performance Based")),
(3, ("Not Assigned")),
)
user = models.OneToOneField(User, on_delete=models.CASCADE)
emp_type = models.IntegerField(choices=STATUS_CHOICES, default=1)
start_date = models.DateField(default=timezone.now)
end_date = models.DateField(null=True, blank=True)
user_active = models.BooleanField(default=True)
contact = models.CharField(max_length=13, blank=True)
whatsapp = models.CharField(max_length=13, blank=True)
gender = models.IntegerField(choices=GENDER_CHOICES, default=3)
pay_type = models.IntegerField(choices=PAY_CHOICES, default=3)
pay = models.IntegerField(default=0)
avatar = models.ImageField(upload_to='users/images', default='users/images/default.jpg')
title = models.CharField(max_length=25, unique=False)
#manager_username = models.ForeignKey(User, blank=True, null=True, to_field='username',related_name='manager_username', on_delete=models.DO_NOTHING)
def __str__(self):
return self.user.username
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
views.py
def createAccount(request):
if(request.method == 'POST'):
u_form = SignUpForm(request.POST) # fill it with user details
p_form = ProfileForm(request.POST, request.FILES)
if u_form.is_valid() and p_form.is_valid():
u_form.save()
profile = p_form.save(commit=False)
profile.user = u_form.user
p_form.save()
messages.success(request, f'Account Updated')
return redirect('createAccount')
return render(request, 'mainapp/createAccount.html')
Когда я создаю нового пользователя с информацией его профиля. Я получаю сообщение об ошибке
AttributeError at /create
'SignUpForm' object has no attribute 'user'
Request Method: POST
Request URL: http://localhost:8000/create
Django Version: 2.1
Exception Type: AttributeError
Exception Value:
'SignUpForm' object has no attribute 'user'
Exception Location: C:\Users\Himanshu Poddar\Desktop\ATG IInternship\INTRANET\atg-intranet\Intranet\users\views.py in createAccount, line 23
Python Executable: C:\Users\Himanshu Poddar\AppData\Local\Programs\Python\Python36-32\python.exe
Python Version: 3.6.2
Я думаю, что это та часть, где я ошибаюсь. Вопрос в том, как подключить пользователя к его профилю при регистрации.
u_form.save()
profile = p_form.save(commit=False)
profile.user = u_form.user
Как я могу решить это?