【问题标题】:flask-admin: How to display meaningful foreign key info in edit and create forms?flask-admin:如何在编辑和创建表单中显示有意义的外键信息?
【发布时间】:2017-10-30 06:29:22
【问题描述】:

我有一个使用 SQLAlechemy 的烧瓶应用程序的 Flask-Admin 界面,但我似乎无法弄清楚如何处理外键。具体来说,我有以下两种模型:

class DoctorType(db.Model):
    __tablename__ = 'doctor_type'
    id = db.Column(db.Integer, primary_key=True)
    doctor_type_english_name = db.Column(db.Unicode(255))
    doctors = db.relationship('Doctor')

    def __unicode__(self):
        return self.doctor_type_english_name

class Doctor(db.Model):
    __tablename__ = 'doctor'
    id = db.Column(db.Integer, primary_key=True)
    doctor_english_name = db.Column(db.Unicode(255))
    doctor_type_id = db.Column(db.Integer, db.ForeignKey('doctor_type.id'))

    def __unicode__(self):
        return self.doctor_english_name

我希望 flask-admin 的创建或编辑表单中的医生类型 ID 字段是医生类型英语名称的下拉列表,而不仅仅是像这样的整数输入:

Doctor Type Input Field

我在模型上有__unicode__ 函数(我使用的是python 2.7)。我尝试在我的自定义表单视图中修改 form_ajax_refs 但没有成功。任何帮助将不胜感激!

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy flask-admin


    【解决方案1】:

    在定义数据模型时实现__repr__

    class DoctorType(db.Model):
        #...
        def __repr__(self):
            return self. doctor_type_english_name
    

    【讨论】:

    • 添加 __repr__ 不会有帮助,因为在这种情况下,这与 __unicode__ 函数的作用相同。外键在编辑和删除表单中仍然显示为整数字段。不过感谢您的快速响应!
    • 您是否尝试在模型定义中实现__repr____repr____unicode__ 都适合我。
    • 我做到了。我意识到缺少的是关系,而不是__repr__。再次感谢您的回答!我赞成你的回答,但我还没有足够的代表来赞成任何事情:-(
    • 这太棒了。它就像一个魅力,只需要很少的代码!
    【解决方案2】:

    事实证明,我缺少的是从 Doctor 类到 DoctorType 类的关系。我在 DoctorType.doctors 关系中使用 backref 实现了这一点:

    class DoctorType(db.Model):
        __tablename__ = 'doctor_type'
        id = db.Column(db.Integer, primary_key=True)
        doctor_type_english_name = db.Column(db.Unicode(255))
        doctors = db.relationship('Doctor', backref='doctor_type')
    
        def __unicode__(self):
            return self.doctor_type_english_name
    

    添加后,flask-admin 中的“医生”编辑和创建表单有一个名为 Doctor Type 的新字段,它是 DoctorType.doctor_type_english_name 值的下拉列表,而 Doctor Type ID 字段默认已消失。这是我想要的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      相关资源
      最近更新 更多