Flask,jinja2:是否可以使用render_template()呈现页面的一部分而不影响页面的其余部分

时间:2014-03-31 00:21:37

标签: flask jinja2 flask-wtforms

我有一个主页,其中包含一些不同的表单,其中一个是编辑个人资料表单。我正在使用wtfforms处理表单,并有一个名为edit_profile.html的子模板,它会呈现原始表单和edit_profile视图函数返回的任何错误。我想要做的是:

如果返回错误:在不干扰页面其余部分的情况下呈现子模板edit_profile.html。

目前有一个主页查看功能:

@app.route('/', methods=['GET','POST'])
def home():
  cur = g.db.execute(some_select_statement)
  data = cur.fetchall()
  some_var = some_function(data)
  ep_form = EditProfile()
  return render_template('home.html', some_var=some_var, ep_form=ep_form)

然后是一个处理配置文件编辑的函数:

@app.route('/edit_profile', methods=['GET', 'POST'])
def edit_profile():
  ep_form = EditProfile()
  if ep_form.validate_on_submit():
    # In here is the code that handles the new profile data
  return render_template('edit_html', ep_form=ep_form)

在返回错误的那一刻,返回大部分页面,除了绘制'some_var'以进行渲染。我知道我可以使用Ajax来渲染WTF错误值并保持页面的其余部分不变,但我想知道是否有办法只使用Flask和Jinja。

1 个答案:

答案 0 :(得分:0)

如果在处理表单数据时遇到任何错误,请使用POST数据重定向到home端点(使用代码307)。

@app.route('/edit_profile', methods=['GET', 'POST'])
def edit_profile():
  ep_form = EditProfile()
  if ep_form.validate_on_submit():
    # If the data is validated and good
    # In here is the code that handles the new profile data
    return render_template('edit_html', ep_form=ep_form)
  else:
    # If any errors are encountered, redirect
    # back to the home endpoint along with POST data
    # using code 307
    return redirect(url_for('home'), code=307)

现在在home端点,我们需要处理可能从edit_profile重定向的POST数据。

@app.route('/', methods=['GET','POST'])
def home():
  # fetch data from DB, other values
  ep_form = EditProfile()

  # We need to call validate_on_submit so that 
  # the data is validated and errors are populated
  if request.method == "POST":
    ep_form.validate_on_submit()

  return render_template('home.html', some_var=some_var, ep_form=ep_form)

通过这种方式,主视图功能可以访问表单数据,验证表单数据并显示错误。