微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何创建影响两个表的注册瓶表单,以便将设备链接到其所有者

如何解决如何创建影响两个表的注册瓶表单,以便将设备链接到其所有者

我正在开发一个 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))

控制器表具有指向用户表中用户 ID 的外键。

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 举报,一经查实,本站将立刻删除。