AJAX POST Flask WTForm无需刷新页面

Ром*_*н Б 5 python ajax flask wtforms

美好的一天,我有一个简单的网页,里面有一个电子邮件表格.我正在尝试从中收集数据并填充数据库而不刷新模板.到目前为止,这是我的代码:

形成:

from flask_wtf import Form

class EmailForm(Form):
email = StringField('Email Address', [
    DataRequired(message='Required field'),
    Email(message='Please provide a valid email address')
])

submit = SubmitField('send')
Run Code Online (Sandbox Code Playgroud)

路线:

@app.route('/', methods=('GET', 'POST'))
def index():
form = EmailForm(request.form)
if request.method == 'POST' and form.validate_on_submit():
    try:
        email = Email(form.data['email'])
        db.session.add(email)
        db.session.commit()
    except IntegrityError as e:
        app.logger.info(e)

    return redirect(url_for('index'))

return render_template('index.html', form=form)
Run Code Online (Sandbox Code Playgroud)

阿贾克斯:

$(function() {
  $('#email_submit').bind('click', function() {
    $.getJSON('/', {
      email: $('input[name="email"]').val()
    });
    return false;
  });
});
Run Code Online (Sandbox Code Playgroud)

模板:

<form name="collectEmail" id="collectForm" method="post" action="{{ url_for('index') }}">
    {{ form.hidden_tag() }}
    {{ form.csrf_token }}
    {% if form.csrf_token.errors %}
      <div class="warning">You have submitted an invalid CSRF token</div>
    {% endif %}

    <div class="input-group">
      {{ form.email(class='form-control', placeholder='Your Email *', type='email')}}
      <p class="help-block text-danger"></p>

      <span class="input-group-btn">
        {{ form.submit(class='btn btn-primary', id='email_submit', type='submit') }}
      </span>
    </div>
</form>
Run Code Online (Sandbox Code Playgroud)

数据库成功填充; 但是,我想在提交表单后避免刷新页面.

小智 0

您没有使用 AJAX 发送请求,#email_submit 是提交类型的输入,而不是按钮,因此如果您不使用PreventDefault(),您最终会执行该输入的默认行为。

您有 2 个选项,一个是使用 PreventDefault(),另一个是将输入切换到按钮,这样在 javascript 代码运行之前它不会提交表单。