/ cregister /处的IntegrityError“列'user_customer_id'不能为空”

时间:2018-07-04 14:45:47

标签: django django-models django-forms django-rest-framework django-views

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',)

我有两个单独的表格-RegisterationForm(RF)和CustomerRegistrationForm(CRF)。 CRF继承了RF,我想在单个视图中保存两种形式,即CustomerSignupView。

提交表单时会弹出Intergrity错误,并且保存的数据仅来自RegistrationForm。

如何在保持完整性的情况下将两个表单保存到各自的表中。 谢谢。

2 个答案:

答案 0 :(得分:0)

您还没有显示表单,但是看起来您必须先设置用户,然后再将客户保存到数据库中。

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("/")

答案 1 :(得分:-1)

在创建客户之前,您必须从accounts.models创建一个用户,如果您的r_form是User的实例,则您的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中获取数据。