我正在为一支乐队制作一份参赛表格.我的 idea 是在表单的一部分输入表演或排练的活动信息.下面是Event表的模型:

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)

现在,我想做的是用所有当前成员的条目预先填充这个内联表单集,并将它们默认为存在(大约60个成员).不幸的是,Django doesn't allow initial values in this case.

有什么建议吗?

推荐答案

因此,您不会喜欢这个答案,部分原因是我还没有写完代码,部分原因是工作量很大.

你需要做的是,正如我自己遇到这个时所发现的那样,你需要做的是:

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

我与Brian和Joseph进行了几次卓有成效的谈话,讨论了如何在future 的Django版本中改进这一点;目前,模型表单集的工作方式只会让这个问题变得比通常情况下更麻烦,但是通过一点API清理,我认为它可以变得非常简单.

Django相关问答推荐

如果密码在Django中未被散列,则对其进行散列

ModuleNotFoundError:没有名为guardian.shortcuts的模块

如何使用邮箱确认码创建django注册

django 的 Manager.create() 方法有什么作用?

Pymongo:搜索文档时忽略空输入值

删除所有实例后,Django 模型实例主键不会重置为 1

Django:get_or_create 使用 together_unique 引发重复条目

有没有办法将变量传递给 Django 中的 extended模板?

Django 自定义管理器 - 如何仅返回登录用户创建的对象?

无法通过 pip 安装 Django 2.0

使用 lambda 作为属性的默认值时,Django 1.7.1 Makemigrations 失败

Django - 无法为具有动态 upload_to 值的 ImageField 创建迁移

在python中查找对对象的所有引用

无效的块标签: static

有日期时间±无穷大吗?

在 Django 中测试different layers的最佳实践是什么?

Django unique_together 与可为空的 ForeignKey

AUTH_USER_MODEL 指的是尚未安装和创建的模型 .. AbstractUser 模型无法登录

Django将整数模型字段的范围设置为约束

从 git 存储库中删除并忽略所有具有扩展名的文件