具有多个模型和视图的多页 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()
方法。
当然这是一个比较固定的方案。如果您的应用程序可能会频繁更改(在添加或删除表单的意义上),您将需要提出一个更灵活的解决方案。但是你可以遵循同样的想法。
我正在开发一个现有系统,该系统具有多个表单,可填充 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()
方法。
当然这是一个比较固定的方案。如果您的应用程序可能会频繁更改(在添加或删除表单的意义上),您将需要提出一个更灵活的解决方案。但是你可以遵循同样的想法。