【问题标题】:Multi-page Django form with several models and views具有多个模型和视图的多页 Django 表单
【发布时间】:2019-04-13 18:33:16
【问题描述】:

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

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

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

  • 如果用户没有填写所有表单,让他知道管理员在填写之前不会对其进行验证。
  • 一个标志,以便管理员知道用户还没有完成所有事情并且不会浪费时间。

我尝试在模型上创建一个自定义save 函数,如果某些值为not None,它将保存一个标志,但由于有很多外交关系,并且一些模型被填充在多个页面上这可能很难。

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

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

欢迎任何提示。谢谢。

【问题讨论】:

  • 如果您需要根据来自另一个对象的值在 for 中执行操作,请在呈现您的表单的视图中获取该对象并将 kwargs 传递给您的表单,然后您可以使用在表单的__init__ 中进行修改。如果那是您想要的,则不需要修改保存。试一试,然后发布一些具体不符合您要求的代码。

标签: django forms validation flags


【解决方案1】:

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

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() 方法。

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

【讨论】:

  • 我喜欢这个想法,我会在下一个工作日尝试实现类似的东西并将结果发布在这里。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 2020-04-09
相关资源
最近更新 更多