Вашу проблему легче всего решить, просто отправив POST по тому же URL-адресу, на котором показана ваша форма, и просто перенаправив пользователя со страницы, когда POST успешен. Таким образом, пока форма не будет успешно отправлена, вы не меняете URL.
Если вы просто умираете от POST по другому URL-адресу, вам нужно сохранить данные с помощью сеансов, поскольку вы, очевидно, обрабатываете данные формы между запросами.
Обычно, если вы хотите обрабатывать ошибки в формах, вы используете сеанс и флэш-сообщения. Чтобы сделать это, вы просто добавляете место для появления флеш-сообщений в базовом шаблоне и настраиваете поддержку сеанса, используя что-то вроде pyramid_beaker.
Предполагается, что ваша домашняя страница настроена на «home» named-route:
from pyramid.httpexceptions import HTTPFound
def myview(request):
user = '<default user field value>'
if 'submit' in request.POST:
user = request.POST.get('user')
# validate your form data
if <form validates successfully>:
request.session.flash('Form was submitted successfully.')
url = request.route_url('home')
return HTTPFound(location=url)
return {
# globals for rendering your form
'user': user,
}
Обратите внимание, что если форма не проходит проверку, вы используете тот же код, который вы использовали для первоначального отображения формы, и только в случае успеха вы перенаправляете. Этот формат также может обрабатывать заполнение формы значениями, используемыми при отправке, и значениями по умолчанию.
Вы можете просматривать флэш-сообщения в выбранном вами шаблоне, используя request.session.peek_flash()
и request.session.pop_flash()
.
route_url
также поддерживает изменение строки запроса в сгенерированном URL, если вы хотите пометить представление домашней страницы, чтобы проверить данные сеанса.
Очевидно, что вы можете просто передать все в строке запроса обратно на домашнюю страницу, но это довольно большая уязвимость безопасности, от которой сеансы могут помочь защитить.