在Django中刷新模板

时间:2010-08-24 06:22:51

标签: django django-views django-templates

我有这样的观点:

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})

我该如何实现这样的东西?提前谢谢。

2 个答案:

答案 0 :(得分:2)

您无法在全局范围内维护页面调用之间的状态,因此您需要将数据存储在数据库中。此外,视图在返回页面后无法与浏览器协商任何内容,因此您需要将其拆分为多个视图并为作业生成单独的线程。以下是可能有所帮助的概要:

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

答案 1 :(得分:0)

如果没有来自客户端的某种回调,我无法想到这样做(除非你使用一些我不熟悉的异步服务器机制)。一种方法是让客户端在收到“in_progress”通知后定期轮询服务器,以查看处理是否已完成。服务器端可以分为两个调用,第一个用于处理问题中显示的POST,另一个用于查找和报告给定任务是否已完成。