lestergyl 2014-11-26 06:00 采纳率: 0%
浏览 1564

flask admin 如何管理两个相关联的表格

本人刚接触flask,只是看了一个例子 一个页面编辑一个数据库表,但我有这样两个表 t_a t_b 其中 t_b 的外键是t_a的主键 t_a t_b是一对多的关系,我想在编辑 t_a某一行时候可以在同一个页面添加n个t_b的行,请问这样 flask admin怎么实现 ?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-03 03:12
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    要使用Flask-Admin管理多个关联表,您需要创建一个新的模型类来表示这些表之间的关系。然后,在Flask-Admin的View类中,您可以使用relationship属性来引用这些表。

    以下是一个简单的示例:

    1. 首先,确保安装了Flask和Flask-Admin库:
    pip install Flask Flask-admin
    
    1. 创建您的数据模型(db.py)以定义两个表:
    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy()
    
    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(80), unique=True)
    
    class Tb(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
        # other fields...
    
        user = db.relationship('User', backref=db.backref('tb', lazy='dynamic'))
    
    1. 然后,在您的应用中导入并初始化SQLAlchemy:
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    app.config['SECRET_KEY'] = 'secret!'
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
    db.init_app(app)
    
    1. 在您的视图文件中,创建一个新视图,其中包含两个表的模型,并使用Flask-Admin的view_class参数定义如何显示这两个表:
    from flask_admin import Admin
    from .models import User, Tb
    
    admin = Admin(app, name='My App')
    
    class TbAdmin(Admin.View):
        @admin.is_accessible_by_default()
        def is_accessible(self):
            return True
    
        def is_visible(self):
            return True
    
        def is_moderator_only(self):
            return False
    
        def _prepare_url_for_js_template(self):
            return '%s/%s' % (self.model._meta.db_table, self.model._get_pk_val())
    
        def is_accessible(self):
            if not current_user.is_authenticated:
                flash("Please log in to access this page.", "warning")
                return False
    
            if not current_user.can('add'):
                flash("You do not have permission to add new records.", "warning")
                return False
    
            return super(TbAdmin, self).is_accessible()
    
        def _prepare_url_for_js_template(self):
            return '%s/%s' % (self.model._meta.db_table, self.model._get_pk_val())
        
        def index(self):
            return render_template('index.html', model=Tb, title='Tb')
    
    admin.add_view(TbAdmin(Tb))
    
    1. 最后,在您的模板(例如templates/index.html)中添加一个按钮,用于从另一个页面添加新条目:
    <button class="btn btn-primary" onclick="window.location.href='/admin/tb/add/'">Add a new TB</button>
    

    现在,当用户点击添加按钮时,他们将被重定向到添加TB的新页面。每个TB条目的编辑页将自动包含当前选择的TB条目作为默认值。这允许您在一个页面上管理两个表。

    如果您想为特定的Tb条目添加额外的功能或行为,只需相应地修改TbAdmin类即可。

    评论

报告相同问题?