You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 20:50:16