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,提问作者Павел
相关产品推荐
相关产品推荐

