gpt4 book ai didi

python - 预填充内联 FormSet?

转载 作者:IT老高 更新时间:2023-10-28 21:32:56 26 4
gpt4 key购买 nike

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

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 doesn't allow initial values in this case.

有什么建议吗?

最佳答案

所以,你不会喜欢这个答案,部分原因是我还没有写完代码,部分原因是工作量很大。

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

  1. 花大量时间阅读 formset 和 model-formset 代码以了解它们是如何工作的(某些功能存在于 formset 类中,而其中一些存在于工厂中,这无济于事吐出它们的功能)。您将在后面的步骤中需要这些知识。
  2. 编写您自己的表单集类,它是 BaseInlineFormSet 的子类并接受 initial。这里真正棘手的一点是您必须覆盖__init__(),并且您必须确保它调用BaseFormSet。 __init__() 而不是使用直接父或祖父 __init__() (因为它们分别是 BaseInlineFormSetBaseModelFormSet,并且他们都不能处理初始数据)。
  3. 编写您自己的适当管理内联类的子类(在我的例子中是 TabularInline)并覆盖它的 get_formset 方法以返回 inlineformset_factory( ) 使用您的自定义表单集类。
  4. 在具有内联的模型的实际 ModelAdmin 子类上,覆盖 add_viewchange_view,并复制大部分代码,但使用一大变化:构建您的表单集所需的初始数据,并将其传递给您的自定义表单集(将由您的 ModelAdminget_formsets() 方法返回)。

我与 Brian 和 Joseph 进行了几次富有成效的交谈,讨论如何为 future 的 Django 版本改进这一点;目前,模型表单集的工作方式使这比通常情况下更麻烦,但通过一些 API 清理,我认为它可以变得非常容易。

关于python - 预填充内联 FormSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/442040/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com