【问题标题】:How to save form data to different models with one-to-one relationship in Django如何在Django中以一对一的关系将表单数据保存到不同的模型中
【发布时间】:2010-10-15 13:19:29
【问题描述】:

这其实是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. 处理传入的表单数据,将其拆分为不同的模型并创建必要的对象(即一个User、一个Profile 和2 个Address 对象)?

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      由于您有正确的外键关系,您可以使用内联表单集和模型表单来从多个模型创建表单...

      编辑:

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

      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)
      

      【讨论】:

      • 我研究了表单集和内联表单集,它们似乎适用于您分别拥有许多同类对象或父对象和多个子对象的情况。所以不,我认为它们在这里没有帮助,因为模型层次结构更复杂。
      猜你喜欢
      • 2021-08-04
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2017-12-27
      相关资源
      最近更新 更多