这是我正在寻找的功能 - 用户在默认页面index.html上填写表单。提交后,我收到一个 POST 请求,我将其内容添加到数据库中。接下来,我想加载一个新页面,其内容将取决于表单中的信息。
这是我的实现 - 我正在index(request)
函数中处理POST请求。我最初返回了一个HTTPResponseRedirect(navigation/route.html)
,但后来在搜索 StackOverflow 后发现不可能同时重定向和发送表单的内容。我正在通过返回render(request, 'navigation/route.html', {'form': form})
来解决这个问题.
我只是担心,因为似乎HTTPResponseRedirect
故意阻止用户传递 POST 请求数据,这意味着我尝试绕过该结构限制可能是一个坏主意。
以下是我 views.py 的相关部分:
def index(request):
if request.method == 'POST':
# populate form with information from POST request
form = TripForm(request.POST)
if form.is_valid():
# input into database
trip_instance = Trip(**form.cleaned_data)
trip_instance.save()
# redirect
return render(request, 'navigation/route.html', {'form': form})
else:
# either request is not POST or form did not pass validation checks
form = TripForm
return render(request, 'navigation/index.html', {'form': form})
阻止这种情况的不是HttpResponseRedirect,而是HTTP本身的结构;302重定向告诉浏览器请求新页面,但确实保留了POST字典。
这不是你不应该做你正在做的事情的原因。如文档所述,您应该始终在成功开机自检后执行实际重定向,以便浏览器刷新不会导致重新发布表单。
执行所需操作的方法是在要重定向到的 URL 中传递行程 ID,然后在该视图中查询回它。或者,您可以将值保存在会话中。