Добавление поля в профиль при создании пользователя - PullRequest
0 голосов
/ 23 января 2020

У меня есть форма регистрации, которая выглядит следующим образом:

class SignUpForm(UserForm):
    username = forms.CharField(max_length=32, min_length=1)
    initials = forms.CharField(max_length=3)
    password = forms.CharField(widget=forms.PasswordInput())
    confirm_password = forms.CharField(widget=forms.PasswordInput())'
    ...

Я создаю пользователя следующим образом:

class SignUpView(FormView, LoginErrorView):
    form_class = SignUpForm
    template_name = "website/sign_up.html"

    def form_valid(self, form):
        User.objects.create_user(username=form.cleaned_data['username'],
                                    email=form.cleaned_data['email'],
                                    password=form.cleaned_data['password'])
        ....

Модель профиля выглядит следующим образом:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    initials = models.CharField(max_length=3)
    ....

Я создаю профиль следующим образом:

@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()

Что я хотел бы сделать, это сохранить инициалы в post_save / create_user_profile (в модели профиля) из SignUpForm, когда я Я создаю объект профиля, но я не могу найти простой способ сделать это. Есть идеи?

1 Ответ

0 голосов
/ 23 января 2020

Вы можете сохранить профиль сразу после сохранения пользователя. Попробуйте это:

class SignUpView(FormView, LoginErrorView):
    form_class = SignUpForm
    template_name = "website/sign_up.html"

    def form_valid(self, form):
        user = User.objects.create(username=form.cleaned_data['username'],
                                    email=form.cleaned_data['email'],
                                    password=form.cleaned_data['password'])
        Profile.objects.create(user=user, initials=form.cleaned_data['initials'])

Удалить post_save. Я надеюсь, что это сработает. Если нет, пожалуйста, прокомментируйте.

...