Django зарегистрироваться посмотреть, как получить пользователя из формы пользователя, чтобы назначить профиль для пользователя - PullRequest
1 голос
/ 28 октября 2019

У меня есть эта форма регистрации, где я беру у пользователя значения относительно его имени пользователя и пароля, а также его профиля. Я отдельно создал две формы 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

Как я могу решить это?

1 Ответ

1 голос
/ 28 октября 2019

profile.user = u_form.user действительно вызывает проблемы здесь.

Вы пытаетесь получить доступ к пользователю, созданному SignupForm, но он не задан как свойство формы, но возвращается методом save.

Чтобы это исправить,вам нужно будет захватить пользователя, созданного методом сохранения SignUpForms. Измените блок, в котором вы создаете пользователя и профиль, следующим образом:

...
user = u_form.save()
profile = p_form.save(commit=False)
profile.user = user
...
...