Обновить шаблон в Django - PullRequest
4 голосов
/ 24 августа 2010

У меня есть такое представление:

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 ]

2 голосов
/ 24 августа 2010

Вы не можете поддерживать состояние между вызовами страниц в глобальном масштабе, поэтому вам нужно хранить свои данные в базе данных. Кроме того, представление не может согласовывать что-либо с браузером после того, как оно вернуло страницу, поэтому вам нужно разделить это на несколько представлений и создать отдельный поток для задания. Вот общий план, который может помочь:

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 , для создания и выполнения заданий, но вам все равно придется создавать отдельные представления для обработки информации о состоянии.

0 голосов
/ 24 августа 2010

Я не могу думать об этом без какого-либо обратного вызова от клиента (если вы не используете какой-то асинхронный серверный механизм, с чем я не знаком).Один из способов - периодически запрашивать у клиента сервер после получения уведомления «in_progress», чтобы узнать, завершена ли обработка.Сторону сервера можно разделить на два вызова: сначала для обработки POST, как показано в вашем вопросе, и еще одного, чтобы выяснить и сообщить, завершена ли заданная задача.

...