IntegrityError в / cregister / "Столбец 'user_customer_id' не может быть нулевым" - PullRequest
0 голосов
/ 04 июля 2018

models.py

from django.db import models
from accounts.models import User

# Create your models here.
class Customer(models.Model):
    user_customer  = models.OneToOneField(User)
    customer_name  = models.CharField(max_length=100,blank=True)
    phone_no       = models.CharField(max_length=100,blank=True)
    inserted       = models.DateTimeField(auto_now_add=True,null=True,blank=True)
    created        = models.DateTimeField(auto_now=True,)

views.py

from django.shortcuts import render,redirect
from django.views.generic.edit import CreateView
from accounts.models import User
from accounts.forms import RegisterForm
from .forms import CustomerRegistration
from .models import Customer


def CustomerSignupView(request):
    r_form = RegisterForm(request.POST or None)
    c_form = CustomerRegistration(request.POST or None)
    context = {
            "r_form":r_form ,
            "c_form":c_form ,
          }
    if r_form.is_valid() and c_form.is_valid():
        instance = r_form.save(commit=False)
        instance.is_customer = True
        instance.save()
        c_form.save()
        return redirect("/")
    return render(request,"customerregister.html",context)

forms.py

from django import forms
from .models import Customer

class CustomerRegistration(forms.ModelForm):
    class Meta:
        model = Customer
        fields = ('customer_name','phone_no',)

У меня есть две отдельные формы - RegistivationForm (RF) и CustomerRegistrationForm (CRF). CRF наследует RF, я хочу сохранить две формы в одном представлении, т. Е. CustomerSignupView.

При отправке форм выскакивает ошибка Intergrity, и данные сохраняются только из RegistrationForm.

Как сохранить обе формы в соответствующей таблице с сохранением целостности. Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Вы должны создать пользователя из account.models перед созданием своего клиента, если ваша r_form является экземпляром пользователя, ваша c_form завершится ошибкой, потому что пользователь требуется, чтобы c_form была действительной

if r_form.is_valid():
    instance = r_form.save(commit=False)
    instance.is_customer = True
    instance.save()
    if c_form.is_valid():
        customer = c_form.save(commit=False)
        customer.user_customer = instance
        customer.save()
    return redirect("/")

Предложение : почему вы не наследуете пользователя своему клиенту, поскольку ваш клиент однажды стал пользователем

from accounts.models import User

class Costumer(User):
    ...

Таким образом, вы можете настроить Costumer и User только в одной форме, легко получить доступ к данным из Costumer.

0 голосов
/ 04 июля 2018

Вы не показывали свои формы, но похоже, что вам нужно настроить пользователя перед сохранением клиента в базе данных:

if r_form.is_valid() and c_form.is_valid():
    instance = r_form.save(commit=False)
    instance.is_customer = True
    instance.save()
    customer = c_form.save(commit=False)
    customer.user_customer = instance
    customer.save()
    return redirect("/")
...