Django注册视图如何从用户表单中获取用户以将配置文件分配给用户

问题描述 投票:1回答:1

我有此注册表单,我在其中从用户那里获取有关其用户名和密码以及其身份的信息。我分别创建了两种形式UserFormProfileForm。当用户注册其帐户时,如何将配置文件连接到该用户。

这是我所拥有的

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

我该如何解决?

python django django-models django-forms django-users
1个回答
1
投票

profile.user = u_form.user确实在这里引起问题。

您尝试访问由SignupForm创建的用户,但未将其设置为表单的属性,而是由save方法返回的。

要解决此问题,您需要捕获由SignUpForms的save方法创建的用户。将创建用户和配置文件的块更改为此:

...
user = u_form.save()
profile = p_form.save(commit=False)
profile.user = user
...
© www.soinside.com 2019 - 2024. All rights reserved.