我有这个注册表单,我从用户那里获取有关他的用户名和密码以及他的个人资料的值。我分别创建了两个表单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
我该如何解决这个问题?
最佳答案
profile.user = u_form.user
确实在这里造成了问题。
您尝试访问由 SignupForm
创建的用户,但它未设置为表单的属性,而是由 save
方法返回。
要解决此问题,您需要捕获通过 SignUpForms 的 save 方法创建的用户。将创建用户和配置文件的 block 更改为:
...
user = u_form.save()
profile = p_form.save(commit=False)
profile.user = user
...
关于python - Django注册 View 如何从用户表单获取用户以将配置文件分配给用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58591472/