一尘不染

预填充内联FormSet?

django

我正在为一个乐队制作出勤表。我的想法是在表格的一部分中输入表演或排练的事件信息。这是事件表的模型:

class Event(models.Model):
    event_id = models.AutoField(primary_key=True)
    date = models.DateField()
    event_type = models.ForeignKey(EventType)
    description = models.TextField()

然后,我想使用一个内联FormSet,将乐队成员链接到事件并记录他们是否存在,不在场或被原谅:

class Attendance(models.Model):
    attendance_id = models.AutoField(primary_key=True)
    event_id = models.ForeignKey(Event)
    member_id = models.ForeignKey(Member)
    attendance_type = models.ForeignKey(AttendanceType)
    comment = models.TextField(blank=True)

现在,我想做的是使用所有当前成员的条目预填充此内联FormSet,并默认将它们存在(大约60个成员)。不幸的是,在这种情况下 Django 不允许初始值。

有什么建议?


阅读 272

收藏
2020-03-30

共1个答案

一尘不染

因此,你不会喜欢这个答案,部分是因为我尚未完成编写代码,部分是因为这需要大量工作。

当我自己遇到这个问题时,你需要做的是:

  1. 花大量时间阅读formset和model-formset代码以了解它们的工作原理(某些功能驻留在formset类上,而其中一些功能驻留在工厂函数中,这无济于事)他们)。在后续步骤中,你将需要此知识。
  2. 编写你自己的formset类,该类继承BaseInlineFormSet并接受initial。这里真正棘手的一点是,你必须重写__init__(),并且必须确保调用它BaseFormSet.__init__()而不是使用直接父级或祖父母级__init__()(因为它们分别是BaseInlineFormSetBaseModelFormSet,并且它们都不能处理初始数据)。
  3. 编写你自己的适当admin内联类的子类(在我的情况下是TabularInline),并重写其get_formset方法以返回inlineformset_factory()使用自定义formset类的结果。
  4. ModelAdmin具有内联的模型的实际子类上,重写add_viewchange_view,并复制大部分代码,但有一个大变化:构建表单集所需的初始数据,并将其传递给自定义表单集(由你的表单集返回ModelAdminget_formsets()方法)。
    我已经与Brian和Joseph进行了一些富有成效的聊天,以期为将来的Django版本进行改进。目前,模型表单集的工作方式使此问题变得比通常所要解决的麻烦多了,但是我想对它进行一些API清理非常简单。
2020-03-30