如何从另一个模板中包含的模板在烧瓶中呈现 WTF 表单?
How to render a WTF Form in flask from a template that is included in another template?
我想在我的 home.html 页面中包含 WTF 表单的模板,如下所示:{% include "users/register.html" %} 同时保留呈现 home.html 和表格 register.html 分开如下所示。
我有一个主页 'home.html',它由 'app.py' 文件中的 'index()' 函数路由。
'app.py' 还注册了 'views.py' 文件中定义的蓝图 'user_blueprint'。
我有一个函数 'sign_up',它在名为 'register.html' 的模板中呈现 wtf 表单。
在 home.html 我想这样做:{% include "users/register.html" %}。我的理解是这不起作用,因为表单没有传递给 home.html 并且在 home.html 中包含 register.html 本质上就像复制它并且表单对象不会传递给 home.html
如何在维护蓝图的同时呈现模板 'register.html'(而不仅仅是将表单复制到 'index()')?虽然这可能不是最好的方法,但在这种情况下您会建议什么?谢谢
app.py
import...
app = Flask(__name__)
app.config.from_object('config')
app.secret_key = "123"
UPLOAD_FOLDER = os.path.join(app.root_path, 'static/img/products/')
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
@app.before_first_request
def init_db():
Database.initialize()
@app.route('/')
@app.route('/home')
def index():
products = Product.find_all()
return render_template('home.html', title='Home', products=products)
app.register_blueprint(user_blueprint, url_prefix="/users")
views.py
user_blueprint = Blueprint('users', __name__)
class RegisterUser(FlaskForm):
first_name = StringField('first_name', validators=[DataRequired()])
last_name = StringField('last_name', validators=[DataRequired()])
email = StringField('email', validators=[DataRequired()])
password = StringField('password', validators=[DataRequired()])
@user_blueprint.route('/register', methods=['GET', 'POST'])
def sign_up():
form = RegisterUser(request.form)
if request.method == 'POST' and form.validate():
first_name = form.first_name.data
last_name = form.last_name.data
email = form.email.data
password = form.password.data
print(first_name)
try:
if User.register_user(first_name, last_name, email, password):
session['email'] = email
return redirect(url_for("index"))
except UserErrors.UserError as e:
return e.message
return render_template('users/register.html')
return render_template('users/register.html', form=form)
register.html
{% from "_formhelpers.html" import render_field %}
<form method=post>
<dl>
{{ render_field(form.first_name) }}
{{ render_field(form.last_name) }}
{{ render_field(form.email) }}
{{ render_field(form.password) }}
</dl>
<p><input type=submit value=register>
</form>
home.html,排除不相关html
{% include "users/register.html" %}
我的方法是通过 index()
路由将表单传递给 home.html
,然后使用 {% include "users/register.html" %}
将其添加到您的家中,然后注册表单到处理表单的 sign_up()
路由。
这样您就可以在不同的路径上保持表单的显示和表单的处理...然后在 sign_up()
路径中处理表单后,您可以将用户定向到任何其他页面.
我想在我的 home.html 页面中包含 WTF 表单的模板,如下所示:{% include "users/register.html" %} 同时保留呈现 home.html 和表格 register.html 分开如下所示。
我有一个主页 'home.html',它由 'app.py' 文件中的 'index()' 函数路由。
'app.py' 还注册了 'views.py' 文件中定义的蓝图 'user_blueprint'。
我有一个函数 'sign_up',它在名为 'register.html' 的模板中呈现 wtf 表单。
在 home.html 我想这样做:{% include "users/register.html" %}。我的理解是这不起作用,因为表单没有传递给 home.html 并且在 home.html 中包含 register.html 本质上就像复制它并且表单对象不会传递给 home.html
如何在维护蓝图的同时呈现模板 'register.html'(而不仅仅是将表单复制到 'index()')?虽然这可能不是最好的方法,但在这种情况下您会建议什么?谢谢
app.py
import...
app = Flask(__name__)
app.config.from_object('config')
app.secret_key = "123"
UPLOAD_FOLDER = os.path.join(app.root_path, 'static/img/products/')
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
@app.before_first_request
def init_db():
Database.initialize()
@app.route('/')
@app.route('/home')
def index():
products = Product.find_all()
return render_template('home.html', title='Home', products=products)
app.register_blueprint(user_blueprint, url_prefix="/users")
views.py
user_blueprint = Blueprint('users', __name__)
class RegisterUser(FlaskForm):
first_name = StringField('first_name', validators=[DataRequired()])
last_name = StringField('last_name', validators=[DataRequired()])
email = StringField('email', validators=[DataRequired()])
password = StringField('password', validators=[DataRequired()])
@user_blueprint.route('/register', methods=['GET', 'POST'])
def sign_up():
form = RegisterUser(request.form)
if request.method == 'POST' and form.validate():
first_name = form.first_name.data
last_name = form.last_name.data
email = form.email.data
password = form.password.data
print(first_name)
try:
if User.register_user(first_name, last_name, email, password):
session['email'] = email
return redirect(url_for("index"))
except UserErrors.UserError as e:
return e.message
return render_template('users/register.html')
return render_template('users/register.html', form=form)
register.html
{% from "_formhelpers.html" import render_field %}
<form method=post>
<dl>
{{ render_field(form.first_name) }}
{{ render_field(form.last_name) }}
{{ render_field(form.email) }}
{{ render_field(form.password) }}
</dl>
<p><input type=submit value=register>
</form>
home.html,排除不相关html
{% include "users/register.html" %}
我的方法是通过 index()
路由将表单传递给 home.html
,然后使用 {% include "users/register.html" %}
将其添加到您的家中,然后注册表单到处理表单的 sign_up()
路由。
这样您就可以在不同的路径上保持表单的显示和表单的处理...然后在 sign_up()
路径中处理表单后,您可以将用户定向到任何其他页面.