Django Customer с отношениями onetoone с User - как создать поля для этой модели при создании User?

Вот моя проблема - при создании User в django я хочу также создать Customer с отношениями Onetoone. Я смог заставить это работать, но проблема началась, когда я не смог также создать поля - dob и mobile. (User - это стандартный пользователь django)

Мой forms.py

    class CreateUserForm(UserCreationForm):
    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']
    mobile = CharField(max_length=30)
    
class CreateCustomerForm(ModelForm):
    class Meta:
        model = Customer
        fields = ['mobile', 'dob']

Мой models.py

class Customer(Model):
    user = OneToOneField(User, on_delete=CASCADE)
    mobile = CharField(max_length=12,null=True)
    dob = DateField(null=True)

    def __str__(self):
        return self.user.username

Мой views.py

def customer_registration(request):
    form = CreateUserForm()

    if request.method == 'POST':
        form = CreateUserForm(request.POST)
        if form.is_valid():
            user = form.save()
            username = form.cleaned_data.get('username')
            group = Group.objects.get(name='customer')
            user.groups.add(group)
            Customer.objects.create(
                user=user, 
            )
            messages.success(request, 'Account was created for ' + username)
            return redirect('index')
    context = {'form': form}
    return render(request, 'signup.html', context)

Мне нужно добавить еще 2 поля в модель Customer (dob=form.dob, mobile=form.mobile), я пытался создать вторую форму для этого, но она не работает. Вот что я пробовал:

def customer_registration(request):
    form = CreateUserForm()
    form2 = CreateCustomerForm()

    if request.method == 'POST':
        form = CreateUserForm(request.POST)
        if form.is_valid():
            user = form.save()

            username = form.cleaned_data.get('username')
            group = Group.objects.get(name='customer')
            user.groups.add(group)
            if request.method == 'POST':
                form2 = CreateCustomerForm(request.POST)
                
                mobile = form2['mobile']

                Customer.objects.create(
                user=user, mobile=mobile)
                messages.success(request, 'Account was created for ' + username)
                return redirect('index')
            else:
                print('Error')
    context = {'form': form, 'form2': form2}
    return render(request, 'signup.html', context)

и:

def customer_registration(request):
    form = CreateUserForm()
    form2 = CreateCustomerForm()

    if request.method == 'POST':
        form = CreateUserForm(request.POST)
        form2 = CreateCustomerForm(request.POST)
        if form.is_valid() and form2.is_valid():
            user = form.save()
            mobile = form2.save()
            username = form.cleaned_data.get('username')
            group = Group.objects.get(name='customer')
            user.groups.add(group)
            Customer.objects.create(
                user=user, mobile=mobile,
            )
            messages.success(request, 'Account was created for ' + username)
            return redirect('index')
    context = {'form': form, 'form2': form2}
    return render(request, 'signup.html', context)

У меня действительно есть запасы на этот случай. Есть идеи?

Единственная проблема в том, что ваш CreateCustomerForm не присваивает значение полю user в Customer, вы можете установить значение .user в .instance, обернутом во вторую форму (form2):

def customer_registration(request):
    form = CreateUserForm()
    form2 = CreateCustomerForm()

    if request.method == 'POST':
        form = CreateUserForm(request.POST)
        form2 = CreateCustomerForm(request.POST)
        if form.is_valid() and form2.is_valid():
            user = form.save()
            form2.instance.user = user  # 🖘 assign to the user of the customer
            form2.save()
            username = user.username
            messages.success(request, f'Account was created for {username}')
            return redirect('index')
    context = {'form': form, 'form2': form2}
    return render(request, 'signup.html', context)
Вернуться на верх