首页 > 解决方案 > 如何使用一种形式将数据保存到多个模型?

问题描述

一个漂亮的菜鸟在这里。我正在尝试在使用信号创建帐户时创建用户配置文件。我希望在注册页面中填写用户个人资料的所有字段。这是我要填充的用户配置文件:

class UserProfile(models.Model):
    user = models.ForeignKey(get_user_model(), verbose_name='user', on_delete=models.CASCADE)
    name = models.CharField(max_length=255, null=True)
    contact_number = models.CharField(max_length=11, default="0331232132")

    def __str__(self):
        return self.name

这是我的自定义用户模型:

class CustomUserManager(BaseUserManager):
    def _create_user(self, email, password, **kwargs):
        if not email:
            raise ValueError("The given email must be set")
        email =  self.normalize_email(email)
        user = self.model(email=email, **kwargs)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **kwargs):
        kwargs.setdefault("is_staff", False)
        kwargs.setdefault("is_superuser", False)
        return self._create_user(email, password, **kwargs)

    def create_superuser(self, email, password=None, **kwargs):
        kwargs.setdefault("is_staff", True)
        kwargs.setdefault("is_superuser", True)

        if kwargs.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if kwargs.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(email, password, **kwargs)



class User(AbstractUser):
    username = None
    email = models.EmailField(_("email address"), unique=True)
    

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()

这是我发送到模板的用户创建表单:

class CustomUserCreationForm(UserCreationForm):
    password2 = forms.CharField(
        label=_("Confirm Password"),
        widget=forms.PasswordInput,
    )
    name = forms.CharField()
    contact_number = forms.CharField(
                        max_length=11
                    )
    class Meta:
        model = get_user_model()
        fields = ['email']

我不确定它是否相关,但这是我的自定义电子邮件后端。

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = User.objects.get(email__iexact=username)
        except User.DoesNotExist:
            return None
        except User.MultipleObjectsReturned:
            return User.objects.filter(email=username).order_by('id').first()
        else:
            if user.check_password(password) and self.user_can_authenticate(user):
                return user

    def get_user(self, user_id):
        try:
            user = User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

        return user if self.user_can_authenticate(user) else None

现在我想要的是当用户提交用户创建表单时,电子邮件和密码字段用于创建用户帐户,而姓名和联系号码以及新创建的用户对象用于使用信号创建用户配置文件实例。到目前为止,我看到的所有示例都只处理在配置文件中设置用户对象。

标签: djangodjango-modelsdjango-viewsdjango-forms

解决方案


推荐阅读