基于SQLAlchemy关联模型创建Flask-Admin视图触发ValueError的原因与修复
问题背景与报错
关联模型代码
class Topic(Base): __tablename__ = 'topics' id = mapped_column(Integer, primary_key=True) name = mapped_column(String(50), unique=True) articles = relationship('Article', back_populates='topic') class Article(Base): __tablename__ = 'articles' id = mapped_column(Integer, primary_key=True) title = mapped_column(String(100)) description = mapped_column(Text) views_count = mapped_column(Integer, default=0) image = mapped_column(String(200), nullable=True) created_at = mapped_column(TIMESTAMP, server_default=func.CURRENT_TIMESTAMP()) text = mapped_column(Text) foreign_link = mapped_column(Text, nullable=True) topic_id = mapped_column(Integer, ForeignKey('topics.id')) topic = relationship('Topic', back_populates='articles')
Flask-Admin视图代码
class ArticleView(ModelView): form_columns = [ 'title', 'description', 'views_count', 'image', 'created_at', 'text', 'foreign_link', 'topic', ]
报错信息
...wtforms\widgets\core.py", line 365, in call
for val, label, selected, render_kw in field.iter_choices():
ValueError: not enough values to unpack (expected 4, got 3)
根本原因
Flask-Admin渲染关联字段时,需要从关联模型生成包含(val, label, selected, render_kw)四个元素的选项元组。但Topic模型未定义__str__或__repr__方法,默认的字符串表示无法正确生成第四个参数render_kw,导致迭代选项时只返回3个值,触发解包错误。
修复方案
给Topic模型添加__str__方法,返回用于显示的字段(比如name),让Flask-Admin能正确生成完整的选项元组:
class Topic(Base): __tablename__ = 'topics' id = mapped_column(Integer, primary_key=True) name = mapped_column(String(50), unique=True) articles = relationship('Article', back_populates='topic') def __str__(self): return self.name
内容的提问来源于stack exchange,提问作者user20291246
相关产品推荐
相关产品推荐

