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)