如何在Django中将表单数据保存为具有一对一关系的不同模型

时间:2010-10-15 13:19:29

标签: django django-forms

这实际上是previous question的后续行动。

用户的个人资料数据分布在几个不同的模型上,如下所示:

# Simplified versions, actual classes contain many more fields.

class Profile(models.Model):  # returned by Django's User.get_profile()
    user = models.OneToOneField(User)  

    home_address = models.OneToOneField(Address)
    work_address = models.OneToOneField(Address)

    language = models.CharField(max_length=20)

class Address(models.Model):
    street = models.CharField(max_length=100)
    city = models.CharField(max_length=100)

...当然还有Django的User

我希望用户在一个视图中输入他的所有个人资料数据,特别是这些信息:

  • 用户名(用户)
  • 电子邮件(用户)
  • 语言(个人资料)
  • home_address.street(地址)
  • home_address.city(地址)
  • work_address.street(地址)
  • work_address.city(地址)

那么,什么是最简单的/ Django方式

  1. 构建这样的表格?
  2. 在模板中输出表单?
  3. 处理传入的表单数据,将其拆分为不同的模型并创建必要的对象(即UserProfile和2 Address个对象)?

2 个答案:

答案 0 :(得分:1)

我认为你的模型和表单集需要更多的工作来定制,而不是使用它们来节省。因此,我将使用标准(非模型)表单,手动定义字段类型,并将它们全部保存到相关模型中 - 在视图中,或通过在窗体上定义自己的save()方法并调用它

答案 1 :(得分:0)

我猜,最实用的方法是使用modelForm和formsets ......

您可以使用模型表单从模型创建表单。 Docs here .... 您可以使用内联formset轻松创建表单并保存数据...... Doc here ...

但是,当然,相关模型必须具有用户或配置文件的外键。你的模型结构可能不合适,因为据我所知,内联模型必须有一个外键给另一个,所以此时,你的外键到Profile需要在地址模型......但正如我所说,我是不确定。你可以尝试一下......

由于你有正确的foreignKey关系,你可以使用带有modelform的内联formset来创建一个来自许多模型的表单......

编辑:

据我所知,您可以使用模型(没有表单集)并轻松地在模板中隐藏表单。但是在您处理发布数据的视图函数中,您必须手动设置外部一对一连接。像:

home = Address.objects.create(...)
work = Address.objects.create(...)
Profile.objects.create(home_address=home, work_address=work,...)

或者你可以改变你的模特:

class Profile(models.Model):  # returned by Django's User.get_profile()
    user = models.OneToOneField(User)  
    language = models.CharField(max_length=20)

class Address(models.Model):
    profile = models.ForeignKey(Profile)
    street = models.CharField(max_length=100)
    city = models.CharField(max_length=100)