如果数据以长格式存储在django中,如何创建宽格式数据输入表单

时间:2016-08-10 20:00:08

标签: python django forms django-forms

假设我有一个物种模型'以及地理位置的模型'。

class species(models.Model):
   name = models.CharField(max_length=100)

class location(models.Model):
   name=models.CharField(max_length=100)

我还有第三个模型occurrences,可以跟踪地点物种的出现情况。 (我意识到我也可以使用带有直通表的多对多字段,但这是遗留代码,所以我希望保持原样。)

class occurrences(models.Model):
   species = models.ForeignKey(species)
   location = models.ForeignKey(location)

理想情况下,我希望用户能够以宽表格式输入新的occurrences。所以示意性地,html表单看起来像这样,带有复选框:

                  | Location1 | Location2 | 
         SpeciesA |     x     |           |          
         SpeciesB |           |     x     |

当提交此表单时,它将创建两个新occurrences(位置1处的SpeciesA和位置2处的SpeciesB)。

这似乎是其他人必须拥有的用例,因为用户喜欢电子表格格式。是否有预先存在的django解决方案,允许用户以这种格式输入数据?

1 个答案:

答案 0 :(得分:1)

与这些模型建立ManyToMany关系不会破坏现有代码,也不会对数据库进行任何更改。事实上,您已经拥有ManyToMany,您只需将其标记为此类。

class species(models.Model):
   name = models.CharField(max_length=100)
   species_locations = models.ManyToManyField(Locations,through='Occurrences')

当您运行迁移时,您会注意到它实际上并未对数据库进行任何更改。

此外,此模型中存在错误。

class occurrences(models.Model):
   species = models.ForeignKey(location)
   location = models.ForeignKey(location)

我相信你打算species成为Species

的外键

问题的第二部分主要是在HTML渲染中,要使用的django组件是InlineFormSet,这样可以轻松编辑相关模型。 (如果Occcurence模型是在表格中编辑的,那么你在这里不需要ManyToMany)