具有多个模型和视图的多页 Django 表单

Multi-page Django form with several models and views

我正在开发一个现有系统,该系统具有多个表单,可填充 Django 上的一组模型,但它们彼此相关,并拆分为一些选项卡组件以进行填充。

我的 objective 是制作几个字段 required 以及一种在系统上的任何地方获取该信息的方法,无论 X 表单是否已经完全填满了所需的字段。表单上有一个验证,但只有当用户实际按下保存按钮时才会发生,如果他只是离开页面或者甚至没有进入该选项卡,系统将忽略它。

每个表单完成后都会单独保存在数据库中,这很好,因为用户可能不会一次拥有所有信息,但我需要一种提醒方式:

我试图在模型上创建一个自定义 save 函数,如果某些值是 not None,它会保存一个标志,但由于有很多对外关系,有些模型是填写超过一页可能很难。

我现在正在尝试的另一件事是在主视图上获取表单实例,但由于某种原因,或者它返回的表单不完整,或者 is_valid() 在这些实例上不起作用。

我也查看了 FormWizard,但看起来它在每一步后都没有保存在数据库中,而且在已经 运行 的系统上实现起来非常复杂。

欢迎任何提示。谢谢。

如果我正确理解了您的要求,您想要的是一种跟踪用户是否填写了您的所有表格的方法。如果是这种情况,我建议添加一个模型,其目的是准确地追踪这一点。形式为:

class UserFormTracking(models.Model):
    user = models.ForeignKey(settings.AUTH_MODEL, ..., unique=True)
    form1_completed = models.BooleanField(default=False)
    ...
    formn_completed = models.BooleanField(default=False)

    @property
    def all_completed(self):
        return self.form1_completed and ... and self.formk_completed

然后我会用类似下面的东西覆盖每个表单的 save() 方法(假设这是第 K 个表单的 save() 方法):

def save(self, user, **kwargs):
    instance = super(MyForm, self).save(**kwargs)
    forms_tracking_instance = UserFormTracking.objects.get_or_create(user=user)
    forms_tracking_instance.formk_completed = True
    forms_tracking_instance.save()

    return instance

请注意,您需要将用户传递给 save() 方法。这可能来自 http 请求,但这可能会有所不同。之后,剩下的检查用户 u 是否填写了每张表格的所有事情就是查询 UserFormTracking 模型以查找用户为 u 且每个 formk_completed 都已设置的实例至 True。 请记住,为了防止不一致,您可能希望在事务中执行表单的重写 save() 方法。

当然这是一个比较固定的方案。如果您的应用程序可能会频繁更改(在添加或删除表单的意义上),您将需要提出一个更灵活的解决方案。但是你可以遵循同样的想法。