繁体   English   中英

如何在另一个模板中呈现模板表单。 Python、Flask、Jinja2

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM