且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Tyring使用Flask-Admin设置模型视图会导致ImportError

更新时间:2023-08-26 20:27:40

您的代码在 __ init __。py 中的app.models import User 中有行。问题是 app.models from。导入db 。这是一个循环导入: __ init __ 试图导入用户,它试图导入 db ,直到 __ init __ 试图导入 User 之后才被定义。要解决这个问题,请将您的本地应用程序导入移到所有全局扩展插件的定义之下。



目前,您的代码如下所示:

  from flask_sqlalchemy import SQLAlchemy 
from app.models import User
$ b $ db = SQLAlchemy()

您需要将其更改为:

  from flask_sqlalchemy import SQLAlchemy 
$ b $ db = SQLAlchemy()

from app.models import User


I am trying to add a User model view to Flask-Admin. However, I get ImportError: cannot import name db. Why is this happening and how do I fix it?

app/__init__.py:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import flask_admin as admin
from app.models import User

db = SQLAlchemy()
admin = admin.Admin(name="Admin Panel")

def create_app(config_name):
    app = Flask(__name__)
    db.init_app(app)
    admin.init_app(app)
    admin.add_view(ModelView(User, db.session))
    return app

app/models.py:

from . import db, login_manager

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)

When I add admin.add_view(ModelView(User, db.session)), I have to add from app.models import User as well. I get this error after adding these lines:

Traceback (most recent call last):
      File "manage.py", line 3, in <module>
        from app.models import User, Role
      File "/home/qadim/PycharmProjects/esouq/app/__init__.py", line 1, in <module>
        from app.models import User
      File "/home/qadim/PycharmProjects/esouq/app/models.py", line 9, in <module>
        from . import db, login_manager
    ImportError: cannot import name db

Your code has the line from app.models import User in __init__.py. The problem is that app.models has from . import db. This is a circular import: __init__ tries to import User, which tries to import db, which isn't defined until after __init__ tries to import User. To solve this, move your local app imports below the definitions of all the global extension stuff.

Currently, your code looks something like:

from flask_sqlalchemy import SQLAlchemy
from app.models import User

db = SQLAlchemy()

You need to change it to:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

from app.models import User