我有这样的观点:
def form1(request):
if request.method == 'POST':
form = SyncJobForm(request.POST)
if form.is_valid():
# do something
in_progress = True
return render_to_response('form1.html', {'in_progress': in_progress})
我想知道如何设置它以完成视图过程后刷新模板.就像在完成后渲染页面一样:
in_progress = True
return render_to_response('form1.html', {'in_progress': in_progress})
# after its finished
finished = True
return render_to_response('form1.html', {'finished': finished})
我该如何实现这样的东西?提前致谢.
最佳答案 您无法在全局基础上维护页面调用之间的状态,因此您需要将数据存储在数据库中.此外,视图在返回页面后无法与浏览器协商任何内容,因此您需要将其拆分为多个视图并为作业生成单独的线程.以下是可能有所帮助的概要:
def do_something():
my_job = Jobs.get(id=blah)
my_job.in_progress = True
my_job.save()
# Do some stuff here....
my_job.in_progress = False
my_job.save()
def step1(request):
in_progress = Jobs.get(id=blah).in_progress
if not in_progress:
if request.method == 'POST':
form = SyncJobForm(request.POST)
if form.is_valid():
thread.start_new_thread(do_something)
return HttpResponseRedirect(step2)
else:
return render_to_response('form.html', 'form': form)
else:
form = SyncJobForm()
return render_to_response('form.html', 'form': form)
else:
return HttpResponseRedirect(step2)
def step2(request):
in_progress = Jobs.get(id=blah).in_progress
if in_progress:
return render_to_response('in_progress.html')
else:
return HttpResponseRedirect(finished)
def finished(request):
return render_to_response('finished.html')
然后让您的页面in_progress.html定期刷新页面.作业完成后,您可以在finished.html中显示状态消息.
有更复杂的方法来执行此操作(编写Javascript以定期轮询服务器),但您仍然需要编写单独的视图以响应相应的信息.此外,您可以使用像Celery这样的作业管理框架来创建和执行作业,但是您仍然需要创建单独的视图来处理状态信息.