Как отображать данные, полученные в результате POST, в представлении django?

У меня есть форма, которая принимает путь в качестве входных данных, анализирует файлы и подпапки в этом каталоге, сохраняет информацию в базе данных, а затем отображает пользователю некоторую статистику о только что проанализированных файлах. В настоящее время это делается с использованием представления Django и render_to_response.

Согласно всему, что я прочитал, неправильно использовать что-либо другое, кроме HttpResponseRedirect, при работе с POST, поскольку страница, сгенерированная с данными POST, повторно отправит форму, если страница будет обновлена.

Моя проблема заключается в том, что в конечном итоге в результате анализа файлов по указанному пути отображается большой объем сводных данных. Как я могу отобразить эти данные с помощью httpResponseRedirect? Отправка его в виде параметров GET с использованием django.core.urlresolvers.reverse кажется невозможной из-за объема данных.


person Nathan    schedule 16.11.2010    source источник


Ответы (3)


Вы можете поместить данные в request.session

http://www.djangobook.com/en/beta/chapter12/#cn36

http://docs.djangoproject.com/en/1.2/topics/http/sessions/

person mike    schedule 16.11.2010
comment
Я не думал об этом. request.session поддерживается на стороне сервера, а не что-то, что фактически отправляется с самим запросом, поэтому это позволило бы мне хранить ряды данных, сгенерированных в этом отчете, и перенаправлять на страницу, которая их отображает. Я новичок в веб-разработке, и это не похоже на предполагаемое использование сеансов, но это кажется относительно элегантным решением этой проблемы. Спасибо. - person Nathan; 17.11.2010
comment
Этот метод оказался действительно гладким. Я просто помещаю объект результатов, который я создал, в request.session, а затем получаю доступ к нему в представлении, на которое я перенаправляюсь. - person Nathan; 17.11.2010

Я предполагаю, что ваш дескриптор POST создает некоторый объект базы данных из отправленных данных формы, это правильно? Если это так, то вы можете сделать что-то вроде этого (:

    my_obj = MyModel.objects.create(**form.cleaned_data) # This is the part yuo already have, most probably expressed with some other code, but still..
    return HttpResponseRedirect('/url/to/redirect/?id=%d' % obj.id)

На самом деле перенаправление должно использовать функцию reverse(), и я думаю, что у вас должен быть URL-адрес для редактирования объектов MyModel. Тогда вы можете сделать:

    return HttpResponseRedirect(reverse('edit-mymodel', (), {'id': obj.id}))

Соответствующий URL будет выглядеть так:

url('^edit/mymodel/(?P<id>\d+)$', 'apps.myapp', name='edit-mymodel')
person Tomasz Zieliński    schedule 17.11.2010
comment
Да, я думал об этом, но фактическое поведение здесь заключается в том, чтобы анализировать тысячи файлов журналов, создавать тысячи объектов в базе данных, а затем отображать подробную сводную статистику. По этой причине трудно понять, как я мог бы указать на один объект, если бы я не создавал объект специально для результата этой операции. Возможно, это было бы лучшим долгосрочным решением этой проблемы. - person Nathan; 17.11.2010
comment
Что ж, это выглядит как естественный пример пакетной обработки — добавьте модель Batch и сделайте так, чтобы каждый отдельный объект указывал на нее с помощью ForeignKey, а затем используйте batch.id для перенаправления. - person Tomasz Zieliński; 17.11.2010

Грубое, но простое решение — записать ваши данные в текстовый файл json, а затем прочитать их на странице перенаправления (это также избавит вас от перестроения данных при обновлении страницы).

person Don    schedule 17.11.2010