【问题标题】:Flask Admin One to One Relationship and Edit FormFlask Admin 一对一关系和编辑表单
【发布时间】:2020-02-12 15:32:54
【问题描述】:

我正在使用 Flask-Admin 为我的 Web 应用程序构建一个管理仪表板。对于用户/地址关系,我使用的是一对一的关系。在用户编辑表单上,我希望能够像 inline_models 提供的那样编辑地址的各个组成部分(即街道地址、城市或邮政编码)。相反,flask-admin 会生成一个选择字段,并且只允许我选择不同的地址。

我尝试在 UserModelView 定义中使用 inline_models = ['address']。但是,由于用户/地址关系配置为 uselist=False,我得到地址对象不可迭代错误。将 uselist 切换为 True 会影响我代码的其他部分,所以我宁愿将其保留为 False。

通过查看flask-admin/contrib/sqla/forms,在get_forms函数中,它被分配了一个一对多的标签,这是驱动使用选择字段的原因。

在进一步深入研究之前,我认为最好看看其他人是否遇到过此问题或有推荐的修复/解决方法。

models.py

class User(db.Model):    
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64))

    address = db.relationship("Address", backref="user", 
              cascade="all, delete-orphan", lazy=False,
              uselist=False, passive_deletes=True)

class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    line1 = db.Column(db.String(128))
    zip = db.Column(db.String(20), index=True)
    city = db.Column(db.String(64), index=True, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey("user.id",
                                              ondelete="CASCADE"))

admin.py

class UserModelView(ModelView):
     column_list = [User.username, 'address']
     form_columns = (User.username, 'address')

admin = Admin(name='Ask', template_mode='bootstrap3')
admin.add_view(UserModelView(User, db.session))

【问题讨论】:

    标签: flask sqlalchemy flask-admin


    【解决方案1】:

    您可以创建 2 个关系

        # Relation for flask admin inline model
        address_cms_relationsip = db.relationship(
            "Address", backref="user", cascade="all, delete-orphan", lazy=False,
            uselist=True, passive_deletes=True)
    
        address_relationship = db.relationship(
            "Address", cascade="all, delete-orphan", lazy=False,
            uselist=False, passive_deletes=True)
    
        @property
        def address(self):
            return self.address_relationship
    

    在您的代码中,您可以使用属性address

    user: User # some User object
    user.address.city
    

    【讨论】:

      猜你喜欢
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2013-06-17
      • 1970-01-01
      • 2014-03-24
      相关资源
      最近更新 更多