首页 > 解决方案 > 从 CustomUserModel 表单接收完整性错误

问题描述

我想用我的 CustomUserModel 创建一个表单,如下所示,它有一个名为 customer 的扩展模型。

class UserManager(BaseUserManager):
    def create_user(self, email, password=None,is_active=True, is_staff=False, is_admin=False):
        if not email:
            raise ValueError("Users must have email address")
        user_obj = self.model(email = self.normalize_email(email))
        if not password:
            raise ValueError("Users must have a password")

        user_obj.set_password(password)
        user_obj.staff = is_staff
        user_obj.admin = is_admin
        user_obj.active = is_active
        user_obj.save(using=self._db)

        return user_obj

    def create_staffuser(self,email,password=None):
        user = self.create_user(email, password=password,is_staff=True)

        return user

    def create_superuser(self, email, password=None):
        user = self.create_user(email, password=password, is_staff=True, is_admin=True)

        return user



class User(AbstractBaseUser):

    email = models.EmailField(max_length=255,unique=True)
    active = models.BooleanField(default=True)
    staff = models.BooleanField(default=False)
    admin = models.BooleanField(default=False)


    USERNAME_FIELD = 'email'
    # email and password are required by default
    REQUIRED_FIELDS = []

    objects = UserManager()

    def __str__(self):
        return self.email

    def get_full_name(self):
        return self.email

    def get_short_name(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_admin(self):
        return self.admin

    @property
    def is_active(self):
        return self.active


class Customer(models.Model):

    GENDER = (
            ('Male', 'Male'),
            ('Female', 'Female'),
            )

    TITLE = (
            ('Mr', 'Mr'),
            ('Mrs', 'Mrs'),
            ('Miss', 'Miss'),
            ('Ms', 'Ms'),
            ('Dr', 'Dr'),
            ('Sir', 'Sir'),
            ('Madam', 'Madam'),
            )



    user = models.OneToOneField(User,on_delete=models.CASCADE)
    title = models.CharField(max_length=200, null=True, choices=TITLE)
    first_name = models.CharField(max_length=200, null=True)
    middle_name = models.CharField(max_length=200, blank=True,default='')
    last_name = models.CharField(max_length=200, null=True)
    phone = models.CharField(max_length=200, null=True)
    country = CountryField()
    birth_year = models.CharField(max_length=4, null=True)
    gender = models.CharField(max_length=200, null=True, choices=GENDER)
    date_created = models.DateTimeField(auto_now=True, null=True)
    profile_pic = models.ImageField(null=True, blank=True)
    last_purchase = models.DateTimeField(blank=True, null=True)


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


下面显示了我的 views.py 来创建一个新的客户/用户表单,我想同时创建它。


@login_required(login_url='login')
def NewCustomerProfile(request):
    user_form = RegisterForm()
    customer_form = CustomerProfileForm()
    if request.method == 'POST':
        user_form = RegisterForm(request.POST)
        customer_form = CustomerProfileForm(request.POST)

        if user_form.is_valid() and customer_form.is_valid():
            user_form.save()
            customer_form.save()
            return redirect('/')
    return render(request, 'accounts/new_customer_profile.html', {'user_form': user_form,'customer_form':customer_form})

请参阅下面显示我的两个模型的表格


class CustomerProfileForm(ModelForm):
    class Meta:
        model = Customer
        fields = ['title','first_name','middle_name','last_name','phone','country','birth_year','gender']

class RegisterForm(forms.ModelForm):
    """
    A form for creating new users. Includes all the required
    fields, plus a repeated password.
    """
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('email','admin', 'active')

我收到如下所示的错误

IntegrityError at /new_customer_profile/
NOT NULL constraint failed: accounts_customer.user_id

问题是一旦建立并创建了用户,就可以创建新客户。我想根据上面显示的模型、表单和视图同时创建一个没有错误的新用户和客户。

如何解决?

标签: pythondjangodjango-modelsdjango-formsdjango-views

解决方案


保存后的 ModelForm 返回实例。此外,它具有允许您不将模型保存到数据库的参数。将这两者结合起来,您的解决方案就是:

        if user_form.is_valid() and customer_form.is_valid():
            user = user_form.save()
            customer = customer_form.save(commit=False)
            customer.user = user
            customer.save()
            return redirect('/')


推荐阅读