Django: перенаправление на текущую страницу после того, как метод POST показывает предупреждение о повторной публикации
Я так смущен этой проблемой, что хочу, чтобы кто-то мог указать на мою ошибку.
У меня есть метод в views.py, который связан с шаблоном, в котором есть форма. Код выглядит так:
def template_conf(request, temp_id):
template = ScanTemplate.objects.get(id=int(temp_id))
if request.method == 'GET':
logging.debug('in get method of arachni.template_conf')
temp_form = ScanTemplateForm(instance=template))
return render_response(request, 'arachni/web_scan_template_config.html',
{
'template': template,
'form': temp_form,
})
elif request.method == 'POST':
logging.debug('In post method')
form = ScanTemplateForm(request.POST or None, instance=template)
if form.is_valid():
logging.debug('form is valid')
form.save()
return HttpResponseRedirect('/web_template_conf/%s/' %temp_id)
Поведение этой страницы таково: когда я нажимаю кнопку "отправить", программа вводит POST
филиал, и успешно все выполнено в филиале. Тогда HttpResponseRedirect
только перенаправление на текущую страницу (этот URL является текущим, я думаю, должен быть равен .
). После этого GET
ветвь была выполнена, так как я перенаправил на текущую страницу, и страница вернулась успешно. Однако, если я обновлю страницу в это время, браузер выдаст предупреждение о подтверждении:
The page that you're looking for used information that you entered.
Returning to that page might cause any action you took to be repeated.
Do you want to continue?
Если я подтверждаю, данные будут снова опубликованы в бэкэнде. Похоже, что браузер все еще содержит предыдущие данные POST. Я не знаю, почему это происходит, пожалуйста, помогите. Благодарю.
2 ответа
Если для вашей формы установлено значение ".", Вам не нужно выполнять перенаправление. Предупреждение браузера не может быть отменено вами. Ваш код может быть значительно упрощен:
# Assuming Django 1.3+
from django.shortcuts import get_object_or_404, render_to_response
def template_conf(request, temp_id):
template = get_object_or_404(ScanTemplate, pk=temp_id)
temp_form = ScanTemplateForm(request.POST or None, instance=template)
if request.method == 'POST':
if form.is_valid():
form.save()
# optional HttpResponseRedirect here
return render_to_response('arachni/web_scan_template_config.html',
{'template': template, 'form': temp_form})
Это просто сохранит вашу модель и повторно отобразит вид. Если вы хотите сделать перенаправление HttpResponse в другое представление после вызова .save()
, это не заставит браузер предупредить вас о необходимости повторной отправки данных POST.
Кроме того, нет необходимости, и это не очень хорошая практика, жестко кодировать шаблоны URL, на которые вы будете перенаправлять. Использовать reverse
метод из django.core.urlresolvers. Это сделает ваш код намного проще для последующего рефакторинга, если ваши URL нужно будет изменить.
Похоже, вы столкнулись с ошибкой в Chrome 25 (см. Выпуск Chromium 177855), которая неправильно обрабатывает перенаправление. Это было исправлено в Chrome 26.
Ваш оригинальный код верен, хотя его можно немного упростить, как предлагает Брэндон. Я рекомендую вам выполнить редирект после успешного пост-запроса, так как он предотвращает случайную повторную отправку данных пользователем (если только в его браузере не обнаружена ошибка!).