Django 表单向导备份和恢复
Posted
技术标签:
【中文标题】Django 表单向导备份和恢复【英文标题】:Django Form Wizard backup and restore 【发布时间】:2014-08-30 12:57:50 【问题描述】:我在理解 Django 的 contrib 库中的表单向导模块并将其应用备份和恢复功能时遇到了一个小问题。
我尝试创建一个使用数据库来存储当前状态而不是 cookie 或会话的存储类,但这并没有解决我的问题,因为当表单初始化时,所有旧数据都被清除,这在两个 cookie 存储中都是相同的和会话存储(我的是模仿 cookie 之一,但保存到 db)
我需要填写的问题是,如果用户在第 x.th 步中离开了表单(假设电已熄灭),然后再次登录并启动向导,则用户必须继续直到完成或单击“取消” (还没有实现)。
【问题讨论】:
我相信您是自己存储表单数据,而不是依赖表单向导。如果您还可以为用户存储最后一步,请从您存储的数据中为向导传递初始数据。 我依赖表单向导,我得到了 5 个表单和 3 个带有外键的模型。我想在 .done() 之前存储步骤数据,以便以后恢复。 【参考方案1】:您可以像这样覆盖视图中的 post 方法:
class YourWizardView(SessionWizardView):
def post(self, *args, **kwargs):
form = self.get_form(
data=self.request.POST, files=self.request.FILES)
data = self.get_all_cleaned_data()
form.is_valid() # to generate cleaned data
data.update(form.cleaned_data)
#Save your data HERE
return super(YourWizardView, self).post(*args, **kwargs)
def get_form_instance(self, step):
# Getting obj instance values
obj = None
if 'pk' in self.kwargs:
obj = get_object_or_404(
YourModel, pk=self.kwargs['pk'])
return self.instance_dict.get(step, obj)
如果您希望用户返回并查看数据而不单击下一步,您可以执行一些 javascript 以通过 ajax 发布数据(例如每 5 秒)
【讨论】:
感谢您的回答,以类似的方式覆盖 post()。在 is_valid 检查和 set_step_[data|files]() 函数之后,我对一个将 get_all_cleaned_data() 保存到temporary_data 表的函数进行了小调用。您知道如何将temporary_data表中的数据放入表单并使其从用户离开的地方开始吗?以上是关于Django 表单向导备份和恢复的主要内容,如果未能解决你的问题,请参考以下文章
如何使用现有模型和迁移恢复 Django 项目的转储数据库备份?