[英]How do I render a template form inside another template. Python, Flask, Jinja2
刚刚学习了 Python 课程,我正在尝试自己尝试一些东西(只是为了让你知道我的经验水平)。
我有一个非常基本的社交应用程序,当管理员登录时,它会将他们带到 admin.html,它扩展了 layout.html。
在此管理页面上,我想包含/呈现另一个模板,该模板具有向数据库添加内容的表单。 有点像另一个模板内的模板表单。 唯一的问题是,我不断收到错误,我已经尝试了一些方法来修复它,但我被卡住了。 以下是我认为与问题和错误跟踪相关的代码部分。
希望有人可以用基本的术语解释我哪里出错了。
admin.html
{% extends 'layout.html' %}
{% block content %}
<h1>Welcome to the admin page!</h1>
{% include 'standards.html' %}
{% endblock content %}
标准。html
{% extends "layout.html" %}
{% from 'macros.html' import render_field %}
{% block content %}
<form method="POST" action="">
{{ form.hidden_tag() }}
{% for field in form %}
{{ render_field(field) }}
{% endfor %}
<button type="submit" id="submit">Add Standard</button>
</form>
{% endblock %}
应用程序.py
@app.route('/login', methods=('GET', 'POST'))
def login():
form = forms.LoginForm()
if form.validate_on_submit():
try:
user = models.User.get(models.User.email == form.email.data)
except models.DoesNotExist:
flash("Your email or password doesn't match!", "error")
else:
if check_password_hash(user.password, form.password.data):
login_user(user)
if (user.is_admin == 1):
return redirect(url_for('admin'))
else:
flash("You've been logged in!", "success")
return redirect(url_for('index'))
else:
flash("Your email or password doesn't match!", "error")
return render_template('login.html', form=form)
@app.route('/admin', methods=('GET', 'POST'))
@login_required
def admin():
if (models.User.is_admin == True):
return render_template('admin.html')
else:
return redirect(url_for('index'))
@app.route('/add_standard', methods=('GET', 'POST'))
@login_required
def set_standard():
form = forms.StandardForm()
if form.validate_on_submit():
models.Standards.create_standard(
section=form.section.data,
standard=form.standard.data
)
flash("Standard created! Thanks!", "success")
return redirect(url_for('index'))
return render_template('standards.html', form=form)
模型.py
class Standards(Model):
section = CharField(unique=False)
standard = CharField(unique=True)
class Meta:
database = DATABASE
@classmethod
def create_standard(cls, section, standard):
try:
with DATABASE.transaction():
cls.create(
section=section,
standard=standard
)
except IntegrityError:
raise ValueError("Standard already exists")
forms.py
class StandardForm(FlaskForm):
section = TextAreaField('Set section title', validators=[DataRequired()])
standard = TextAreaField('Enter the standard to be added', validators=[DataRequired()])
错误跟踪
File "D:\Dropbox\Coding Projects\learner-driver-app\venv\Lib\site-packages\flask\app.py", line 2091, in __call__
return self.wsgi_app(environ, start_response)
File "D:\Dropbox\Coding Projects\learner-driver-app\venv\Lib\site-packages\flask\app.py", line 2076, in wsgi_app
response = self.handle_exception(e)
File "D:\Dropbox\Coding Projects\learner-driver-app\venv\Lib\site-packages\flask\app.py", line 2073, in wsgi_app
response = self.full_dispatch_request()
File "D:\Dropbox\Coding Projects\learner-driver-app\venv\Lib\site-packages\flask\app.py", line 1518, in full_dispatch_request
rv = self.handle_user_exception(e)
File "D:\Dropbox\Coding Projects\learner-driver-app\venv\Lib\site-packages\flask\app.py", line 1516, in full_dispatch_request
rv = self.dispatch_request()
File "D:\Dropbox\Coding Projects\learner-driver-app\venv\Lib\site-packages\flask\app.py", line 1502, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
File "D:\Dropbox\Coding Projects\learner-driver-app\venv\Lib\site-packages\flask_login\utils.py", line 272, in decorated_view
return func(*args, **kwargs)
File "D:\Dropbox\Coding Projects\learner-driver-app\app.py", line 109, in admin
return render_template('admin.html')
File "D:\Dropbox\Coding Projects\learner-driver-app\venv\Lib\site-packages\flask\templating.py", line 147, in render_template
return _render(
File "D:\Dropbox\Coding Projects\learner-driver-app\venv\Lib\site-packages\flask\templating.py", line 128, in _render
rv = template.render(context)
File "D:\Dropbox\Coding Projects\learner-driver-app\venv\Lib\site-packages\jinja2\environment.py", line 1291, in render
self.environment.handle_exception()
File "D:\Dropbox\Coding Projects\learner-driver-app\venv\Lib\site-packages\jinja2\environment.py", line 925, in handle_exception
raise rewrite_traceback_stack(source=source)
File "D:\Dropbox\Coding Projects\learner-driver-app\templates\admin.html", line 1, in top-level template code
{% extends 'layout.html' %} {% block content %}
File "D:\Dropbox\Coding Projects\learner-driver-app\templates\layout.html", line 70, in top-level template code
{% block content %}{% endblock %}
File "D:\Dropbox\Coding Projects\learner-driver-app\templates\admin.html", line 3, in block 'content'
{% include 'standards.html' %}{% endblock content %}
File "D:\Dropbox\Coding Projects\learner-driver-app\templates\standards.html", line 1, in top-level template code
{% extends "layout.html" %} {% from 'macros.html' import render_field %} {% block content %}
File "D:\Dropbox\Coding Projects\learner-driver-app\templates\layout.html", line 70, in top-level template code
{% block content %}{% endblock %}
File "D:\Dropbox\Coding Projects\learner-driver-app\templates\standards.html", line 3, in block 'content'
{{ form.hidden_tag() }} {% for field in form %} {{ render_field(field) }} {% endfor %}
File "D:\Dropbox\Coding Projects\learner-driver-app\venv\Lib\site-packages\jinja2\environment.py", line 474, in getattr
return getattr(obj, attribute)
jinja2.exceptions.UndefinedError: 'form' is undefined
终于想通了。 对'form undefined'的引用实际上是指管理视图function。 因为我正在通过其中有一个表单的“standards.html”,所以我还需要告诉管理员视图 function 在某个时候,它会通过一个表单。 即使管理视图本身不使用表单。
所以从我的原始代码来看,新代码如下所示:
@app.route('/admin')
@login_required
def admin():
form = forms.StandardForm()
if (models.User.is_admin == True):
return render_template('admin.html', form=form)
else:
return redirect(url_for('index'))
在我的 admin.html 模板中,我只使用:
{% include 'standards.html' %}
现在它工作正常:感谢大家的支持! :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.