Javascript 刷新Flask web app页面时提交上一选择的Html表单
在我的Flask应用程序中,我有一个简单的POST类型和4个同名单选按钮选项。当我选择一个选项并按“下一步”(提交类型输入)时,一个新页面将加载不同的内容,但形式相同 问题是,如果我刷新新加载的页面,表单将使用与先前选择的选项具有相同值的选项提交 表格: 我只想能够刷新页面而不发布表单 我已经试过使用Javascript 刷新Flask web app页面时提交上一选择的Html表单,javascript,python,html,flask,Javascript,Python,Html,Flask,在我的Flask应用程序中,我有一个简单的POST类型和4个同名单选按钮选项。当我选择一个选项并按“下一步”(提交类型输入)时,一个新页面将加载不同的内容,但形式相同 问题是,如果我刷新新加载的页面,表单将使用与先前选择的选项具有相同值的选项提交 表格: 我只想能够刷新页面而不发布表单 我已经试过使用 document.getElementById("myForm").reset(); 以及 <body onload="document.myForm.reset();"> 此处提
document.getElementById("myForm").reset();
以及
<body onload="document.myForm.reset();">
此处提供完整代码(annotator.py、app/templates/index.html和app/templates/base.html):
编辑:session只是一个全局变量,我用它来存储东西。名称在python代码的开头初始化,save_annotation()和get_least_annotated_page()是函数
EDIT2:加载新页面时,所有按钮均未选中。但当我刷新时,会提交一个选项。我只是通过查看命令行输出才注意到。您可以尝试:
document.getElementById(“op1”).prop('checked',false)
这将取消选中单选按钮。这可以对每个页面执行。当您刷新页面时,浏览器将执行最后一个操作,在您的情况下是一个POST 避免这种情况的方法是将返回更改为重定向,而不是渲染:
if request.method == 'POST':
...
return redirect(url_for('this_view'))
...
我找到了一个有效的解决方案。在我确定之前,它可能需要更多的测试,但目前它运行良好 基本上,我会保留一个变量,当用户选择一个选项时,该变量将递增。然后将会话(服务器端)中存储的值与POST请求在表单中发送的版本进行比较。如果它们相同,则这是刷新,否则这是正常提交 代码: 客户端(index.html)::
加载新页面时,该按钮未选中。加载新页面时,将取消选中所有按钮。但如果我按下刷新(从浏览器),它会提交最后选择的按钮。如果我不看命令行,我就不会注意到。哦,我明白了。我想知道这是否与在python代码末尾返回render_模板(“index.html”)有关。可能是在刷新页面时发送了旧版本?不幸的是,因为我还必须传递一些参数(我没有将它们放在这里以使其看起来更简单),所以我不能使用重定向。我会在我的问题中加上这一点。我还想到了一个主意,那就是使用window.onbeforeunload(){return}停止刷新。我会试试看,如果行得通,我会把答案贴出来。我的想法行不通。我目前正试图发送一个变量,当勾选某个选项时,该变量会发生变化。服务器将比较新旧文件,以检查这是刷新还是提交。
<body onload="document.myForm.reset();">
autocomplete="off"
if request.method == 'POST':
...
return redirect(url_for('this_view'))
...
<form method="post">
<table align="center" cellpadding="10" border="0" style="background-color: antiquewhite;">
<tr>
<td rowspan="2"><h3>Is this an <i>origin</i> for the <i>claim?</i></h3></td>
<td><input type="radio" name="op" id="op1" onchange="incAlpha();" value="1" >Yes</td>
<td><input type="radio" name="op" id="op2" onchange="incAlpha();" value="2" >No</td>
<td rowspan="2"><input type="submit" value=Next></td>
</tr>
<tr>
<td><input type="radio" name="op" id="op3" onchange="incAlpha();" value="3" >Invalid Input</td>
<td><input type="radio" name="op" id="op4" onchange="incAlpha();" value="4" >Don't Know</td>
</tr>
</table>
<input type="hidden" id="alpha" name="alpha" value={{alpha}}>
</form>
<script type="text/javascript">
var globFlag=true; // use so that the incrementation is only triggered once every page load
function incAlpha()
{
if(globFlag)
{
let value= document.getElementById("alpha").value;
document.getElementById("alpha").value = (parseInt(value)+1)%10;
globFlag=false;
}
}
</script>
name = session.get('username')
alphaFromSession = session.get('alpha')
if request.method == 'POST':
op = request.form.get('op')
alphaFromClient = request.form.get('alpha')
if op and not (alphaFromSession == alphaFromClient):
if op in ['1', '2', '3', '4']:
save_annotation(session.get('claim'),session.get('origin'), op, name)
session['alpha']=alphaFromClient
c_url, o_url, src_lst, donePg, totalPg, done, total = get_least_annotated_page(name, session.get('claim'))
.
.
.
.
return render_template('index.html',t1=c_url, t2=o_url,alpha=session.get('alpha'))