如何解决如何创建影响两个表的注册瓶表单,以便将设备链接到其所有者
我正在开发一个 Web 应用程序,可将传感器数据可视化,以便用户可以监控他们的设备。 Web 应用程序使用 Flask-Security 和 Flask-Admin 来方便用户管理和可视化。
class User(UserMixin,db.Model):
id = db.Column(db.Integer,primary_key=True)
first_name = db.Column(db.String(255))
last_name = db.Column(db.String(255))
email = db.Column(db.String(100),unique=True)
password = db.Column(db.String(100))
class Controller(db.Model):
id = db.Column(db.Integer,primary_key=True)
controller_id = db.Column(db.String(100),nullable=False,unique=True)
user_id = db.Column(db.Integer,db.ForeignKey('user.id'))
注册模板
<form action="{{ url_for_security('register') }}" method="POST" name="register_user_form">
{{ register_user_form.hidden_tag() }}
{{ render_field_with_errors(register_user_form.email) }}
{{ render_field_with_errors(register_user_form.controller_id) }}
{{ render_field_with_errors(register_user_form.first_name) }}
{{ render_field_with_errors(register_user_form.last_name) }}
{{ render_field_with_errors(register_user_form.password) }}
{% if register_user_form.password_confirm %}
{{ render_field_with_errors(register_user_form.password_confirm) }}
{% endif %}
{{ render_field(register_user_form.submit,class="btn btn-primary") }}
</form>
在页面上看起来像这样 Register Form
问题是用户注册表不影响控制器表。我使用扩展验证表单来添加更多字段。
class ExtendedRegisterForm(RegisterForm):
first_name = StringField('First Name')
last_name = StringField('Last Name')
controller_id = StringField('Controller ID',[required()],default="")
必须先创建新用户,然后才能将设备链接到用户 ID,但使用相同的形式发送数据。
解决方法
这里没有魔法——你必须为你的表单提供数据——Flask-Security 不做任何神奇的查询生成。在这种情况下 - 我认为您只需要实现“注册”上下文处理器并获取控制器 ID。 在此处阅读更多信息:https://flask-security-too.readthedocs.io/en/stable/customizing.html#views
,解决了使用 Flask-Security 时的问题。
@user_registered.connect_via(app)
def user_registered_sighandler(app,user,confirm_token):
default_role = user_datastore.find_role("user")
user_datastore.add_role_to_user(user,default_role)
form = ExtendedRegisterForm()
controller_id = form.controller_id.data
controller = Controller.query.filter_by(controller_id=controller_id).first()
controller.user_id = user.id
这是使用 Flask-Security-Too 时的解决方案。
@user_registered.connect_via(app)
def user_registered_sighandler(app,confirm_token,form_data):
default_role = user_datastore.find_role("user")
user_datastore.add_role_to_user(user,default_role)
controller_id = form_data["controller_id"]
controller = Controller.query.filter_by(controller_id=controller_id).first()
controller.user_id = user.id
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。