2014-11-05 29 views
1

我有这个小Flask程序。它期望用户的姓名和年龄,然后打印一条消息。真的很容易,因为我刚刚开始使用Python和Flask。如何从使用WTForm构建的表单中清空数值

from flask import Flask, render_template 
from flask.ext.bootstrap import Bootstrap 
from flask.ext.wtf import Form 
from wtforms import StringField, IntegerField, SubmitField 
from wtforms.validators import Required, Length, NumberRange 

app = Flask(__name__) 
app.config['SECRET_KEY'] = 'top secret!' 
bootstrap = Bootstrap(app) 

class NameForm(Form): 
    name = StringField('What is your name?', validators = [Required(), Length(1, 16)]) 
    age = IntegerField('How old are you?', validators = [Required(), NumberRange(min=1, max=99, message="Should be between 1 and 99")]) 

    submit = SubmitField('Submit') 

@app.route('/', methods=['GET', 'POST']) 
def index(): 
    name = None 
    age = None 
    form = NameForm() 
    if form.validate_on_submit(): 
     name = form.name.data 
     age = form.age.data 
     form.age.raw_data = None 
     form.name.data = '' 

    return render_template('index.html', form = form, name = name, age = age) 

if __name__ == '__main__': 
    app.run(debug = True) 

而且,对于HTML模板,我有: {%伸出 “引导/ base.html文件” %}

{% block title %}Form Example{% endblock %} 

{% block navbar %} 
    <nav class="navbar navbar-inverse" role="navigation"> 
     <div class="container"> 
      <a href="{{ url_for('index') }}" class="navbar-brand">Hello</a> 
     </div> 
    </nav> 
{% endblock %} 

{% block content %} 
    <div class="container"> 
     <form method="POST" action=""> 
      {{ form.name.label }} {{ form.name(size=16, class='name-field') }} 
      {% for error in form.name.errors %} 
       {{ error }} 
      {% endfor %} 

      <br> 

      {{ form.age.label }} {{ form.age(class='age-field') }} 
      {% for error in form.age.errors %} 
       {{ error }} 
      {% endfor %} 

      <br /> 
      {{ form.submit() }} 
      {{ form.hidden_tag() }} 
     </form> 
     {% if name %} 
      <h1>Hello, {{ name.capitalize() }}</h1> 
      <h2>You're {{ age }} years old.</h2> 
     {% endif %} 
    </div> 
{% endblock %} 

我的问题是,我提交表单后,输入名称是空的,但年龄输入不是。为什么?我怎样才能清空数字字段?

谢谢。

回答

3

感谢您提出明确的问题 - 我可以想到的最简单的方法就是创建它并告诉它忽略请求表单数据。

@app.route('/', methods=['GET', 'POST']) 
def index(): 
    form = NameForm() # Auto-populates from request data. 
    name = None 
    age = None 
    if form.validate_on_submit(): 
     name = form.name.data 
     age = form.age.data 

     # Lets now create a form, but ignore the request data, so it's empty: 
     form = NameForm(formdata=None) 
    return render_template('index.html', form = form, name = name, age = age) 

另外,我注意到你正在使用Required()这是在被替换的进展由DataRequired(),将在WTF V3消失,所以你可能想现在就开始使用它,你的未来的自己会感谢你!

+0

您的回答确实解决了问题,因此我接受了这个答案。但是,既然我们在这里,为什么我以前的代码擦除了NAME,但不会擦除AGE字段?我认为,因为name属性是一个字符串,而age是一个整数,所以可以用''清空一个字符串,并且数值应该以不同的方式清空。它有任何意义吗? – 2014-11-06 00:59:23

+2

它难倒了我一段时间,看起来像'raw_data'是一个列表。指定'form.age.raw_data = ['']'可以得到你需要的结果。它确实觉得应该有更直接的方式! – Doobeh 2014-11-06 03:19:02

相关问题