Как да покажа данни, получени от POST в django view?

Имам формуляр, който приема път като вход, анализира файлове и подпапки в тази директория, съхранява информация в база данни, след което показва някои статистики на потребителя за току-що анализираните файлове. В момента това се прави с помощта на 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