如何防止重新填充此表单数据?
How do I prevent this form data from repopulating?
我刚刚完成了一个简单的猜数网页游戏,告诉用户他们的数字是高于还是低于解决方案。
向网页提交数据时,页面会正确更新游戏数据,除了文本输入字段填写了之前刚刚提交的数据。在进行另一个猜测之前不得不删除字段中的文本很烦人,我更希望它用空表单字段呈现模板。
我过去可以通过使用重定向而不是 render_template 来解决这个问题,但在这种情况下我需要 render_template 才能将数据传递到页面。
另外,如果对我的设计有任何一般性建议,我们将不胜感激,我在这方面还很陌生。
页面功能如下:
@app.route('/numbers', methods=['GET', 'POST'])
def numbers():
x = open(os.path.join(basedir, 'textdata/nums.txt'), 'r')
numdata = x.readlines()
solved = True if numdata[0] == 'Solved\n' else False
tries = int(numdata[1][:-1])
answer = int(numdata[2])
x.close()
form = NumForm()
newform = NewNumForm()
if newform.validate_on_submit() and request.form['btn'] == 'New Game':
randnum = randint(1, 100)
x = open(os.path.join(basedir, 'textdata/nums.txt'), 'w')
x.write('Unsolved\n0\n' + str(randnum))
x.close()
return redirect('/numbers')
if form.validate_on_submit() and request.form['btn'] == 'Submit':
num = form.num.data
if num not in [str(i) for i in range(1, 101)]:
return render_template('numbers.html', form=form, ttl='Numbers',
tries = tries, wrongin = True)
tries += 1
if int(num) == answer:
x = open(os.path.join(basedir, 'textdata/nums.txt'), 'w')
x.write('Solved\n' + str(tries) + '\n' + str(answer))
x.close()
return render_template('numend.html', form=newform, ttl='Numbers',
tries = tries, justsolved = True,
answer = answer)
if int(num) > answer:
greater = False
if int(num) < answer:
greater = True
x = open(os.path.join(basedir, 'textdata/nums.txt'), 'w')
x.write('Unsolved\n' + str(tries) + '\n' + str(answer))
x.close()
return render_template('numbers.html', form=form, ttl='Numbers',
tries = tries, greater = greater, num = num)
if solved:
return render_template('numend.html', form=newform, ttl='Numbers',
tries = tries, answer = answer)
return render_template('numbers.html', form=form, ttl='Numbers',
tries = tries)
class NumForm(Form):
num = StringField('num')
class NewNumForm(Form):
pass
页面模板:
{% extends "base.html" %}
{% block content %}
<br>
<br><form action="" method="post" name="numform">
{{ form.hidden_tag() }}
<p>
{% if num %}
{% if greater %}
The number is greater than {{ num }}
{% else %}
The number is smaller than {{ num }}
{% endif %}
{% endif %}
<h2>Guess the number! (between 1 and 100)</h2>
<br>
{{ form.num(size='3', autofocus=true) }}
<br>
{% for error in form.num.errors %}
<span>[{{ error }}]</span>
{% endfor %}<br>
</p>
<p><input type="submit" value="Submit" name="btn"></p>
{% if wrongin %}
<span>Whole numbers 1-100 only</span>
<br>
{% endif %}
Tries: {{ tries }}
</form>
<br>
{% endblock %}
如果您希望像以前一样继续使用 render_template
,一个简单的解决方法是添加以下行:
form.num.data = None
就在您致电 render_template
之前。这将删除表单中该特定字段的数据。
对于实际应用程序,最佳做法是在提交表单后立即重定向,这样用户就不会单击浏览器上的刷新按钮而意外地重新提交表单。如果您需要在重定向之间传递数据,您可以查看 Flash 消息,甚至可以使用 Session 来存储数据。
我刚刚完成了一个简单的猜数网页游戏,告诉用户他们的数字是高于还是低于解决方案。
向网页提交数据时,页面会正确更新游戏数据,除了文本输入字段填写了之前刚刚提交的数据。在进行另一个猜测之前不得不删除字段中的文本很烦人,我更希望它用空表单字段呈现模板。
我过去可以通过使用重定向而不是 render_template 来解决这个问题,但在这种情况下我需要 render_template 才能将数据传递到页面。
另外,如果对我的设计有任何一般性建议,我们将不胜感激,我在这方面还很陌生。
页面功能如下:
@app.route('/numbers', methods=['GET', 'POST'])
def numbers():
x = open(os.path.join(basedir, 'textdata/nums.txt'), 'r')
numdata = x.readlines()
solved = True if numdata[0] == 'Solved\n' else False
tries = int(numdata[1][:-1])
answer = int(numdata[2])
x.close()
form = NumForm()
newform = NewNumForm()
if newform.validate_on_submit() and request.form['btn'] == 'New Game':
randnum = randint(1, 100)
x = open(os.path.join(basedir, 'textdata/nums.txt'), 'w')
x.write('Unsolved\n0\n' + str(randnum))
x.close()
return redirect('/numbers')
if form.validate_on_submit() and request.form['btn'] == 'Submit':
num = form.num.data
if num not in [str(i) for i in range(1, 101)]:
return render_template('numbers.html', form=form, ttl='Numbers',
tries = tries, wrongin = True)
tries += 1
if int(num) == answer:
x = open(os.path.join(basedir, 'textdata/nums.txt'), 'w')
x.write('Solved\n' + str(tries) + '\n' + str(answer))
x.close()
return render_template('numend.html', form=newform, ttl='Numbers',
tries = tries, justsolved = True,
answer = answer)
if int(num) > answer:
greater = False
if int(num) < answer:
greater = True
x = open(os.path.join(basedir, 'textdata/nums.txt'), 'w')
x.write('Unsolved\n' + str(tries) + '\n' + str(answer))
x.close()
return render_template('numbers.html', form=form, ttl='Numbers',
tries = tries, greater = greater, num = num)
if solved:
return render_template('numend.html', form=newform, ttl='Numbers',
tries = tries, answer = answer)
return render_template('numbers.html', form=form, ttl='Numbers',
tries = tries)
class NumForm(Form):
num = StringField('num')
class NewNumForm(Form):
pass
页面模板:
{% extends "base.html" %}
{% block content %}
<br>
<br><form action="" method="post" name="numform">
{{ form.hidden_tag() }}
<p>
{% if num %}
{% if greater %}
The number is greater than {{ num }}
{% else %}
The number is smaller than {{ num }}
{% endif %}
{% endif %}
<h2>Guess the number! (between 1 and 100)</h2>
<br>
{{ form.num(size='3', autofocus=true) }}
<br>
{% for error in form.num.errors %}
<span>[{{ error }}]</span>
{% endfor %}<br>
</p>
<p><input type="submit" value="Submit" name="btn"></p>
{% if wrongin %}
<span>Whole numbers 1-100 only</span>
<br>
{% endif %}
Tries: {{ tries }}
</form>
<br>
{% endblock %}
如果您希望像以前一样继续使用 render_template
,一个简单的解决方法是添加以下行:
form.num.data = None
就在您致电 render_template
之前。这将删除表单中该特定字段的数据。
对于实际应用程序,最佳做法是在提交表单后立即重定向,这样用户就不会单击浏览器上的刷新按钮而意外地重新提交表单。如果您需要在重定向之间传递数据,您可以查看 Flash 消息,甚至可以使用 Session 来存储数据。