【问题标题】:Flask: How to access current user when creating forms?Flask:创建表单时如何访问当前用户?
【发布时间】:2022-01-02 10:28:13
【问题描述】:

我发现这个问题以各种方式提出略有不同,但答案似乎陈旧或不完全符合我的要求。 我有一个功能正常的 Flask 应用程序,带有 Flask-Security 和一些 WTF 表单。用户可以登录,填写表格等等,一切都很好。

现在,我需要在创建表单时访问用户设置(衬衫尺寸),以便在用户填写表单时将其显示给用户(因此这不是验证问题)。 我添加到表单文件中: from flask_security import current_user 访问设置current_user.ts_size,但我面临 AttributeError: 'NoneType' object has no attribute 'ts_size'

我知道这意味着 current_user 是 NoneType,问题是为什么?我在定义视图的文件中使用相同的导入行,没有任何问题。视图用auth_required 装饰,因此当需要创建表单并将其显示给用户时,它已经检查了用户是否已通过身份验证。 我错过了什么?

from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired
from flask_security import current_user

class JacketForm(FlaskForm):
  material = StringField(validators=[DataRequired()],)
  size = StringField(validators=[DataRequired()], description=current_user.ts_size) 

【问题讨论】:

  • 谢谢。看完之后,我不确定它是否能回答我的问题。在我看来,它正在解决维护自定义 current_user 的一般问题。 current_user 在我的应用程序中工作没有任何问题。我可能错了,但对我来说问题可能是在创建表单对象时访问 current_user 的应用程序实例。我想“工厂”表单是在会话之外生成的,所以用户是无,所以在会话中调用时,它仍然是无。

标签: python flask flask-wtforms flask-security


【解决方案1】:

您的代码发生了一些事情。首先 - 请记住,字段定义是类变量 - 因此在实例化表单时这些变量不会改变。第二 - StringField 没有关键字参数 'cur_size' - 它确实有一个关键字参数 'default' - 可以是可调用的!

所以尝试一下:

size = StringField(validators=[DataRequired()], default=lambda: current_user.ts_size)

【讨论】:

  • 谢谢,你是对的,这是一个糟糕的简化。但是它并没有解决我首先访问数据的问题。
  • 请提供更多信息 - current_user 是一个代理 - 并且仅在请求期间有效。请注意 current_user 已经被注入到 jinja - 所以你可以在你的表单中轻松访问它 - {{ current_user.ts_size }}
  • 您好@jwag,再次感谢您抽出宝贵时间。从 jinja 模板访问 current_user 很好,但需要对该字段进行特定处理。我希望尽可能多地附加表单定义中的额外信息,以便我仍然可以在模板中有一个简单的循环。然后我可以测试额外数据的存在并显示它。
  • 你没有提到为什么使用 'default' 和 lambda 是不够的。我假设您在用户发出 GET 时将表单实例化为视图的一部分。您始终可以设置表单值 - form.size.data = current_user.ts_size
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多