You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask+SQLAlchemy开发问题:表单分类列表与查询异常

Flask表单与SQLAlchemy问题解答

问题1:"categories is not defined" 错误

问题原因

在createProductForm类定义阶段,prodCategory字段直接引用categories变量,但此时categories是类构造方法__init__的参数,仅在实例化表单时才会传入,类属性定义时该变量不存在,因此触发未定义错误。

修正代码

from flask_wtf import FlaskForm
from wtforms import StringField, IntegerField, SelectField, SubmitField
from wtforms.validators import DataRequired, NumberRange
from app import db, app

class createProductForm(FlaskForm):
    prodSku = StringField('Артикул', validators=[DataRequired()])
    prodName = StringField('Название', validators=[DataRequired()])
    # 先初始化SelectField,暂不设置choices,添加coerce=int确保接收整数ID
    prodCategory = SelectField('Категория', validators=[DataRequired()], coerce=int)
    prodLength = IntegerField('Длина упаковки (см)', validators=[DataRequired(), NumberRange(min=0, max=9999)])
    prodWidth = IntegerField('Ширина упаковки (см)', validators=[DataRequired(), NumberRange(min=0, max=9999)])
    prodThick = IntegerField('Толщина упаковки (см)', validators=[DataRequired(), NumberRange(min=0, max=9999)])
    prodWeight = IntegerField('Вес (гр)', validators=[DataRequired(), NumberRange(min=0, max=999999)])
    purchasePrice = IntegerField('Закупочная цена (р.)', validators=[DataRequired(), NumberRange(min=0, max=9999999)])
    submit = SubmitField('Создать')

    def __init__(self, categories, *args, **kwargs):
        # 必须先调用父类构造方法
        super().__init__(*args, **kwargs)
        # 动态设置分类选项,格式为(分类ID, 分类名称)
        self.prodCategory.choices = [(category.id, category.name) for category in categories]

问题2:按卖家key过滤后categories为空

问题原因

直接使用productCategory.seller.key == 'TEST'作为过滤条件,SQLAlchemy无法自动关联sellers表,导致查询逻辑错误,无法匹配到数据。此外需确保数据库中存在key为'TEST'的卖家记录,且该卖家有对应的分类数据。

修正代码

@app.route('/create-product', methods=['GET', 'POST'])
def createProduct():
    # 显式关联sellers表,按卖家key过滤分类
    categories = db.session.query(productCategory)\
        .join(seller, productCategory.sellerId == seller.id)\
        .filter(seller.key == 'TEST')\
        .all()

    # 转换为表单需要的格式(如果之前的表单已修正,这里直接传入categories即可)
    categoriesList = [(cat.id, cat.name) for cat in categories]

    form = createProductForm(categories)
    if form.validate_on_submit():
        currentProduct = product()
        currentProduct.sku = form.prodSku.data
        currentProduct.name = form.prodName.data
        currentProduct.category = form.prodCategory.data
        currentProduct.length = form.prodLength.data
        currentProduct.width = form.prodWidth.data
        currentProduct.thick = form.prodThick.data
        currentProduct.weight = form.prodWeight.data
        currentProduct.purchasePrice = form.purchasePrice.data
        db.session.add(currentProduct)
        db.session.commit()
        flash('Новый товар создан')
        return redirect('/index')
    # 修正拼写错误:categoties → categories
    return render_template('create-product.html', title='Создание товара', form=form, categories = categories)

额外检查点

  • 确认数据库中存在sellers.key = 'TEST'的记录
  • 确认该卖家对应的productCategories表中有关联的分类数据
  • 修正模板传参的拼写错误(原代码中categoties是拼写错误)

内容的提问来源于stack exchange,提问作者Павел

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:25:55