首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在django注册中自动创建相关模型对象的正确方法是什么?

在django注册中自动创建相关模型对象的正确方法是什么?
EN

Stack Overflow用户
提问于 2017-05-10 07:51:15
回答 1查看 1.1K关注 0票数 0

我完全是Django新手,如果我没有使用正确的术语,请提前道歉。

我正在使用django注册注册用户在我的网络应用程序。我已经成功地将它与我的自定义用户模型GeneralUser相结合。

从概念上讲,每个GeneralUser都有一个Business,这是我定义的另一个模型。无论这是否是正确的决定,我已经决定我永远不想注册一个没有相关的Business对象的用户。

我读过无数关于定制django表单的线程,最后,经过几天的失败尝试,我终于找到了帮助实现解决方案的an answer。但是,我不确定我的代码是否正确/安全。这是my适配,后面是链接答案:

我的适应

代码语言:javascript
复制
class GeneralUserForm(UserCreationForm):
    business_name = forms.CharField(required=True)

    class Meta:
        model = GeneralUser
        fields = ['username', 'email', 'password1',
                  'password2', 'business_name']

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=True)
        business = Business(name=user.business_name, owner=user)

        # notice: no if-block
        user.save()
        business.save()
        # notice: returning only a user-instance
        return user

此代码成功地创建了用户和业务对象,并创建了关系。不过,看看最初的答案代码,我想知道我是否遗漏了一些关键的东西:

答案我的代码基于:

代码语言:javascript
复制
class UserCreateForm(UserCreationForm):
    job_title = forms.CharField(max_length=100, required=True)
    age = forms.IntegerField(required=True)

    class Meta:
        model = User

    def save(self, commit=True):
        if not commit:
            raise NotImplementedError("Can't create User and UserProfile without database save")
        user = super(UserCreateForm, self).save(commit=True)
        user_profile = UserProfile(user=user, job_title=self.cleaned_data['job_title'], 
            age=self.cleaned_data['age'])
        user_profile.save()
        # notice: multiple returns
        return user, user_profile

关于这些差异的几个问题:

  • 如果我这样结束代码,为什么我的代码不能工作:

代码语言:javascript
复制
if commit:
        user.save()
        business.save()
        return user
  • 我不使用cleaned_data,可以吗?
  • if not commit块在原始代码中的用途是什么?
  • 最重要的是,这是一种“合法的方式”来处理用户注册,这需要创建一个自动的对象关系吗?
EN

回答 1

Stack Overflow用户

发布于 2017-05-10 08:22:28

  • cleaned_data是数据字典,在每个字段中都有这种形式的验证。现在您可以决定是否依赖它(最好应该).So作为伪代码,我们可以说cleaned_data + errors将是所有字段。
  • commit用于决定是否应该提交db(write)。从上面的代码中,要添加像profile这样的相关模型对象,必须创建原始对象(User)为什么要强制提交。
  • 要在创建对象时添加相关对象,有多种方法,比如post_save信号、覆盖模型save、重写表单save etc.So --我认为这是一种很好的方法。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43886493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档