如何解决表格未定义,Flask?

时间:2017-04-21 07:00:17

标签: python flask flask-wtforms

我的应用程序中有两条路由,如果我想访问第二条路线,我会收到此错误:

UndefinedError: 'register_form' is undefined

register_form 适用于第一条路线,此处为第一条路线

@abonent_route.route('/')
@abonent_route.route('/', methods=['GET', 'POST'])
def index():

    register_form = RegistrationForm()
    return render_template('index.html', register_form=register_form)

这是第二条路线

@client_route.route('/client/')
@client_route.route('/client/', methods=['GET', 'POST'])
def index():
    form_login = ClientLogin()
    return render_template('index.html', form_login=form_login)

此外,我已在 create_app 功能中初始化路线,如下所示:

from .abonent import abonent_route
app.register_blueprint(abonent_route)

from .client import client_route
app.register_blueprint(client_route)

现在的问题是,如果我将客户路线升级为高于基线路线,如果我打开基线路线,我得到了同样的错误,但有点不同:

UndefinedError: 'form_login' is undefined

这次, form_login未定义,如果我再次将对手移回其位置,如果我想访问客户路线,我得到了第一个错误是 register_form undefined

请提供任何帮助。

修改:添加一些代码

Client main route

@client_route.route('/client/', methods=['GET', 'POST'])
def index():
    form_login = ClientLogin()
    if request.method == 'GET' and request.args.get('next'):
        session['next'] = request.args.get('next')

    if form_login.validate_on_submit():
        user = Client.query.filter_by(
            tele = form_login.telephone.data
        ).first()
        if user:
            if check_password_hash(user.password, form_login.password.data):
                session['client_logged_in'] = user.name
                session['client_family'] = user.family
                session['client_image'] = user.image
                session['client_phone'] = user.tele
                if 'next' in session:
                    next = session.get('next')
                    session.pop('next')
                    return redirect(next)
                else:
                    flash('Привет, {}'.format(user.name), 'success')
                    return redirect(url_for('client.profile'))
            else:
                flash('Неверные учетные данные.', 'danger')
                return redirect(url_for('client.index'))
        else:
            flash('Неверные учетные данные.', 'danger')
            return redirect(url_for('client.index'))
    return render_template('index.html', form_login=form_login)

Abonent main route

@abonent_route.route('/', methods=['GET', 'POST'])
def index():
    register_form = RegistrationForm()
    if request.method == 'POST':
        if register_form.is_submitted():
            if not register_form.terms_agree.data:
                flash('Вы должны согласиться с нашим договором и со всеми его пунктами.', 'danger')
                return redirect(url_for("abonent.index"))
            if register_form.master_salon.data or register_form.master_cto.data or register_form.master_company.data == True:
                user = User()
                user.name = register_form.name.data
                user.family = register_form.family.data
                user.bio = register_form.biography.data
                if User.query.filter_by(tele=register_form.telephone.data).first():
                    flash('Этот номер: {} уже использован.'.format(register_form.telephone.data), "warning")
                    return redirect(url_for('abonent.index'))
                else:
                    user.tele = register_form.telephone.data
                user.set_password(register_form.password.data)
                db.session.add(user)
                db.session.commit()
    return redirect(url_for('abonent.confirm', phone=phone))
return render_template('index.html', register_form=register_form)

以下是完整错误显示位置的链接,如果客户端路径位于__init__.py文件中的 abonent route 下,则会引发此错误:

Click to open

我忘了提到的另一件事是,如果尝试打开例如/client/registration,它会打开而没有任何错误,如果我想访问/client这是{的索引页,则会出错{1}}

2 个答案:

答案 0 :(得分:1)

似乎代码中有一些冗余和阻止信息。

@abonent_route.route('/')
@abonent_route.route('/', methods=['GET', 'POST'])

您不需要两次申报此路线。最重要的是。

  

此外,我已将create_app函数内的路由初始化为   以下内容:

这不是路线宣布。这是一个蓝图。它就像你项目的重要部分。 我的蓝图中可以有很多路线。 你不需要为一条路线描述一张蓝图。

如需更详细的解答,请提供更详细的申请源代码。

看看: http://exploreflask.com/en/latest/blueprints.htmlDO docs

答案 1 :(得分:0)

我一定是在和自己开玩笑哈哈哈哈,我解决了这个问题。

我的客户端文件夹中的__init__.py文件内部我按如下方式配置了路由:

from flask import Blueprint

client_route = Blueprint(
    'client',
    __name__,
    template_folder='templates/client',
    static_folder='../static'
)

from . import views

正如您在此处所见, index.html 必须位于客户端文件夹中,当我在视图中呈现 index.html 时,我忘记在索引之前添加客户端/。这里的HTML:

return render_template('client/index.html', form_login=form_login)

它正在我的主app模板文件夹中查找另一个index.html。

现在一切都运转良好:),感谢所有人的利益。