`属性错误:在管理页面创建用户对象时,“元组”对象没有属性“项目”

问题描述 投票:0回答:1

尝试使用 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 error-handling flask-sqlalchemy
1个回答
0
投票

我在创建新的用户模型或使用 Flask-Admin 编辑用户模型时遇到了这个确切的错误。我通过将

WTForms==3.1.2
添加到我的requirements.txt 中解决了这个问题。这个回归是在 WTForms==3.2.1 中引入的。

© www.soinside.com 2019 - 2024. All rights reserved.