django - передача информации при перенаправлении после POST
У меня есть простая форма, которая при отправке перенаправляет на страницу успеха.
Я хочу иметь возможность использовать данные, которые были представлены на предыдущем шаге, на моей странице успеха.
Насколько я знаю, вы не можете передавать данные POST при перенаправлении, так как вы этого добиваетесь?
В данный момент мне нужно просто напрямую вернуть страницу успеха с того же URL, но это вызывает страшную повторную передачу данных при обновлении.
Использует request.session
единственный путь?
2 ответа
Вы можете:
- Передать данные (либо полные данные, либо просто идентификатор объекта) в request.session
- Перенаправьте что-то вроде? 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. Обычно я делаю следующее:
- Иметь представление со списком объектов и формой для публикации данных
- Успешная публикация в эту форму сохраняет данные и создает перенаправление в подробный вид объекта
Таким образом, вы экономите на 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)