【问题标题】:How to solve the form is undefined , Flask? [closed]如何解决表单未定义,Flask? [关闭]
【发布时间】:2017-04-21 07:00:17
【问题描述】:

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

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)

现在的问题是,如果我将 client route 替换为高于 abonent route 并且如果我打开 abonent route,我得到了同样的错误,但有点不同:

UndefinedError: 'form_login' is undefined

这一次,form_login 未定义,如果我再次将 abonent 移回原位,如果我想访问 client route,我得到了第一个错误是 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)

这是一个显示完整错误的链接,如果 client route 位于 __init__.py 文件中的 abonent route 下,则会引发此错误:

Click to open

我忘记提及的另一件事是,如果尝试打开例如 /client/registration,它会毫无错误地打开,如果我想访问 /client(这是 client 的索引页面),则会引发错误

【问题讨论】:

  • 为什么你有冗余路由?只有一个就足够了,因为两者都路由相同的路径和请求,并且您是否将RegistrationFormClientLogin 导入到您的文件中?这个错误是在什么时候提出的?,您是否应该发布完整的错误以将其追溯到正确的点?
  • 如果我在我的 create_app 函数 中替换了这些路由中的一个,并尝试访问它,则会引发错误,所以如果 abonent 是上面如果我想打开 /client/ 会出现一个错误,上面写着:register_form undefined,反之亦然,客户端会出现另一个错误,上面写着:form_login undefined .
  • 是的,我在我的 abonent views.py 中导入了 RegisterForm 而不是 ClientLogin

标签: python flask flask-wtforms


【解决方案1】:

您的代码中似乎有几个冗余块信息。

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

你不需要两次声明这条路线。底线就够了。

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

这不是路由声明。这是一个蓝图。这就像您项目的重要组成部分。 我可以在你的蓝图中有很多路线。 您不需要为一条路线声明一个蓝图。

如需更详细的答案,请提供更详细的应用程序源代码。

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

【讨论】:

  • 嗨@Vladimir,感谢您的关注,我已经删除了不需要的路线但没有用,每次都显示相同的错误,我可以提供代码,但您对哪一个感兴趣?
  • 我看到了蓝图文档,但是我正在制作的应用程序真的很大,我现在告诉了 4 条路线,每条路线都在一个单独的文件夹中,它们的视图、表单、模板、静态和模型,我不知道'没有看到与我的应用程序结构有任何不同我相信它几乎相同的结构,错误是我无法找到或调试它的地方!!!
  • 我正在访问/client/ 路由,为什么会收到属于/abonent/ 路由的垃圾信息错误!!!!!!
【解决方案2】:

我一定是在自嘲哈哈哈哈,我解决了这个问题。

在我的客户端文件夹中的__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 时,我忘记在 index.html 之前添加 client/。 html在这里:

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

它在我的主应用程序模板文件夹中查找另一个 index.html 保存的位置。

现在一切都很好:),谢谢大家的关注。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 2016-07-12
    • 2013-05-25
    • 2011-07-16
    • 2016-12-07
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多