这实际上是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
。
我希望用户在一个视图中输入他的所有个人资料数据,特别是这些信息:
那么,什么是最简单的/ Django方式
User
,Profile
和2 Address
个对象)?答案 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)