django - передача информации при перенаправлении после POST - PullRequest
5 голосов
/ 06 февраля 2011

У меня есть простая форма, которая при отправке перенаправляет на страницу успеха.

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

Насколько я знаю, вы не можете передавать POST-данные при перенаправлении, так как вы этого достигнете?

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

Является ли использование request.session единственным способом?

Ответы [ 2 ]

8 голосов
/ 06 февраля 2011

Я делаю это все время, нет необходимости в объекте сеанса. Это очень распространенный шаблон POST-redirect-GET . Обычно я делаю следующее:

  1. Просмотр списка объектов и формы для размещения данных
  2. Успешная публикация в этой форме сохраняет данные и создает перенаправление в подробный вид объекта

Таким образом, вы экономите на POST и перенаправляете после сохранения.

Пример представления, предполагающий модель thingies :

def all_thingies(request, **kwargs):
    if request.POST:
        form = ThingieForm(request.POST)
        if form.is_valid():
            thingie = form.save()
            return HttpResponseRedirect(thingie.get_absolute_url())
    else:
        form = ThingieForm()
    return object_list(request, 
                       queryset = Thingie.objects.all().order_by('-id'),
                       template_name = 'app/thingie-list.html',
                       extra_context = { 'form': form },
                       paginate_by = 10)
7 голосов
/ 06 февраля 2011

Вы можете:

  1. Передать данные (либо полные данные, либо просто идентификатор объекта) в request.session
  2. Перенаправить что-то вроде? Id = [id] в URL- где [id] указывает на ваш объект.

Обновление:

По пунктам.1 выше, я имел в виду, что вы можете сделать (в обработчике POST):

my_object = MyModel.objects.create(...)
request.session['my_object_id'] = my_object.id

Или вы можете попробовать передать весь объект (он должен работать, но я не уверен на 100%):

my_object = MyModel.objects.create(...)
request.session['my_object'] = my_object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...