尝试使用 Flask-Admin 和 SQLAlchemy 从管理页面创建用户对象时遇到错误。链接http://127.0.0.1:5000/admin/user/new/?url=/admin/user/中发生的错误是:
AttributeError: 'tuple' object has no attribute 'items'
当我尝试访问管理面板中添加新用户的页面时,出现了问题。我相信这与我将枚举值传递到表单的方式有关,因为我在用户模型中使用枚举类作为角色和性别字段。 在 models.py 中:
class Gender(Enum):
MALE = 'male'
FEMALE = 'female'
class UserRole(Enum):
ADMIN = 'admin'
PATIENT = 'patient'
class User(db.Model, UserMixin):
id = Column(Integer, autoincrement=True, primary_key=True)
username = Column(String(50), unique=True, nullable=False)
password = Column(String(100), nullable=False)
role = Column(EnumType(UserRole), nullable=False)
name = Column(String(100))
birth = Column(Date, default=datetime.date.today)
phone = Column(String(14), default="2134215567")
email = Column(String(100), unique=True)
gender = Column(EnumType(Gender))
address = Column(String(100), default="address")
avatar = Column(String(100),
default="https://res.cloudinary.com/dwvkjyixu/image/upload/v1715592288/avatars/pzh51raolcegilwmhm4g.jpg")
def __str__(self):
return self.username
class Admin(db.Model):
id = Column(Integer, ForeignKey(User.id), primary_key=True)
def __str__(self):
return User.query.get(self.id).name
class Patient(db.Model):
id = Column(Integer, ForeignKey(User.id), primary_key=True)
def __str__(self):
return User.query.get(self.id).name
class Product(db.Model):
id = Column(Integer, autoincrement=True, primary_key=True)
name = Column(String(50), nullable=True )
price = Column(Integer, nullable=True)
if __name__ == '__main__':
with app.app_context():
db.create_all()
在admin.py中
from clinic import app, db
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
from clinic.models import User, UserRole, Product, Gender
from flask_login import current_user
admin = Admin(app=app, name="Private Clinic", template_mode = 'bootstrap4')
class AuthenticatedView(ModelView):
def is_accessible(self):
return current_user.is_authenticated and current_user.role == UserRole.ADMIN
class MyUserView(ModelView):
column_list = ['id', 'name', 'phone', 'username', 'email', 'address', 'role']
column_searchable_list = ['username', 'name', 'phone']
column_editable_list = ['name', 'role', 'gender']
can_export = True
column_filters = ['role']
column_labels = {
'id': 'ID',
'name': 'fullname',
'phone': 'SĐT',
'username': 'user name',
'email': 'Email',
'address': 'address',
'role': 'role',
}
admin.add_view(MyUserView(User, db.session))
admin.add_view(ModelView(Product, db.session))
在init.py中:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import cloudinary
from flask_login import LoginManager
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = 'mysql+pymysql://root:12345@localhost/myclinic?charset=utf8mb4'
app.secret_key = '^%^&%^(*^^&&*^$%((^^&$$&^'
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True
app.config["PAGE_SIZE"] = 4
cloudinary.config(
cloud_name = 'mycloud',
api_key = 'api_key',
api_secret = 'api_secret'
)
db = SQLAlchemy(app)
login = LoginManager(app)
我怀疑这个问题与我的用户模型中的枚举字段有关。在此之前,我在不使用 Enum 的情况下测试了一个 Product 类,它运行良好,没有任何错误。
有人可以帮我理解为什么我在 Flask Admin 中的枚举字段中遇到此错误,而代码在没有它们的情况下可以正常工作吗?
提前致谢!
我在创建新的用户模型或使用 Flask-Admin 编辑用户模型时遇到了这个确切的错误。我通过将
WTForms==3.1.2
添加到我的requirements.txt 中解决了这个问题。这个回归是在 WTForms==3.2.1 中引入的。