如何防止重新填充此表单数据?

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 来存储数据。