在Django中刷新模板

我有这样的观点:

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这样的作业管理框架来创建和执行作业,但是您仍然需要创建单独的视图来处理状态信息.

点赞