两个Flask函数能否共用同一Jinja2模板?表单回传路由问题
解决方案
要让表单根据调用模板的路由动态回传,核心思路是在渲染模板时传递当前路由的端点信息,然后在模板中动态生成表单的action属性。
步骤1:修改Flask路由,传递端点参数
在两个调用模板的路由函数中,渲染模板时添加submit_endpoint参数,直接使用request.endpoint可以自动获取当前路由的端点名称,无需手动硬编码:
from flask import request, render_template from . import auth # auth.all路由 @auth.route('/all', methods=['GET', 'POST']) def all(): # 生成用户列表的原有逻辑 users = get_users() # 传递当前路由端点给模板 return render_template('user_list.html', users=users, submit_endpoint=request.endpoint) # auth.select路由 @auth.route('/select', methods=['GET', 'POST']) def select(): users = get_users() return render_template('user_list.html', users=users, submit_endpoint=request.endpoint)
步骤2:修改模板,动态生成表单action
把模板中固定的action="{{ url_for('auth.all')}}"替换为动态调用url_for(submit_endpoint):
{% extends 'base.html' %} {% block title %}List Users{% endblock %} {% block content %} <div class="w3-container"> <h1 class='w3-padding-16' style="margin-top: 32px;">User List</h1> <!-- 动态生成表单提交目标 --> <form method="POST" action="{{ url_for(submit_endpoint)}}"> {% if users %} {% for user in users %} <div> {% if user.email %} <input class="" type="radio" id="choice_{{ user.id }}" name="selection" value="{{ user.id }}"> <label for="choice_{{ user.id }}">{{ user.User }}("{{ user.first }} {{ user.last }}")</label> {% else %} <p>Username: {{ user.User }}(unregistered)</p> {% endif %} </div> {% endfor %} {% else %} <h2>No users found in database.</h2> {% endif %} <div class="w3-bar w3-padding-16"> <button type='submit' class="w3-button w3-black">Select</button> <a href="{{ url_for('main.index') }}" class="w3-button w3-black">Cancel</a> </div> </form> </div> {% endblock %}
额外说明:带动态参数的路由
如果你的路由包含动态参数(比如@auth.route('/select/<int:group_id>')),需要额外传递参数给模板:
@auth.route('/select/<int:group_id>', methods=['GET', 'POST']) def select(group_id): users = get_users_by_group(group_id) # 传递端点和所需参数 return render_template( 'user_list.html', users=users, submit_endpoint=request.endpoint, submit_args={'group_id': group_id} )
模板中修改为:
<form method="POST" action="{{ url_for(submit_endpoint, **submit_args)}}">
这样就能适配带参数的路由场景。
内容的提问来源于stack exchange,提问作者ColinB
相关产品推荐
相关产品推荐

