django - передача информации при перенаправлении после POST

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

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

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

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

Использует request.session единственный путь?

2 ответа

Решение

Вы можете:

  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

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

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

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

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

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)
Другие вопросы по тегам