具有OneToOne关系的Django模型?

mpe*_*pen 7 django django-forms

假设我使用默认auth.models.User加上我的自定义ProfileAddress模型,如下所示:

class Profile(models.Model):
    user = models.OneToOneField(User)
    primary_phone = models.CharField(max_length=20)
    address = models.ForeignKey("Address")

class Address(models.Model):
    country = CountryField(default='CA')
    province = CAProvinceField(default='BC')
    city = models.CharField(max_length=80)
    postal_code = models.CharField(max_length=6)
    street1 = models.CharField(max_length=80)
    street2 = models.CharField(max_length=80, blank=True, null=True)
    street3 = models.CharField(max_length=80, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个注册表单.我可以创建一个ModelForm基于User但不会包括字段ProfileAddress(需要哪些).那么建立这种形式的最佳方式是什么?我应该使用ModelForm吗?

此外,我如何使用相同的表单来编辑复杂对象?我可以很容易地将一个Profile实例传回给它,它保存对必要的Address和Profile对象的引用,但是如何让它为我填写字段呢?

Clé*_*ent 8

怎么用3分开ModelForm.一个Address,一个User,一个,Profile但有:

class ProfileForm(ModelForm):
  class Meta:
    model = Profile
    exclude = ('user', 'address',)
Run Code Online (Sandbox Code Playgroud)

然后,在您的视图中分别处理这3个表单.具体而言,对于ProfileForm使用savecommit=False更新user,并address在实例字段:

# ...
profile_form = ProfileForm(request.POST)
if profile_form.is_valid():
  profile = profile_form.save(commit=False)
  # `user` and `address` have been created previously
  # by saving the other forms
  profile.user = user
  profile.address = address
Run Code Online (Sandbox Code Playgroud)

不要犹豫,在这里使用事务,以确保只有当3个表单有效时才会插入行.