电商网站更新商品表单预填现有数据的实现求助
解决更新商品表单预填问题
你的代码存在几处关键逻辑和语法问题,导致表单无法预填现有商品信息,以下是具体修正方案:
1. 修复Models.py语法错误
Addproduct类的description字段缺少闭合括号,先补上:
class Addproduct(db.Model): #__tablename__ = 'addproduct' id:Mapped[int] = mapped_column(Integer,primary_key=True) name:Mapped[str] = mapped_column(String(80),nullable=False, unique=True) price:Mapped[int] = mapped_column(Integer,nullable=False) discount:Mapped[int] = mapped_column(Integer,default=0) stock:Mapped[int] = mapped_column(Integer,nullable=False) colors:Mapped[Text] = mapped_column(Text,nullable=False) description:Mapped[Text] = mapped_column(Text,nullable=False) # 补上缺失的闭合括号 category_id:Mapped[int] = mapped_column(Integer, db.ForeignKey('category.id'),nullable=False) category = db.relationship('Category',backref=db.backref('category', lazy=True)) brand_id:Mapped[int]= mapped_column(Integer, db.ForeignKey('brand.id'),nullable=False) brand = db.relationship('Brand',backref=db.backref('brand', lazy=True)) image_1:Mapped[str] = mapped_column(String, nullable=False, default='image1.jpg') image_2:Mapped[str] = mapped_column(String, nullable=False, default='image2.jpg') image_3:Mapped[str] = mapped_column(String, nullable=False, default='image3.jpg')
2. 调整Forms.py的QuerySelectField配置
QuerySelectField需要指定get_label匹配数据库名称字段,否则无法正确选中现有品牌/分类:
class AddProducts(FlaskForm): name = StringField('Name',validators=[DataRequired()]) price = IntegerField('Price',validators=[DataRequired()]) discount = IntegerField('Discount', default=0) stock = IntegerField('Stock',validators=[DataRequired()]) # 添加get_label参数,指定显示name字段 brands = QuerySelectField('Add a brand', query_factory=brandchoices, get_label='name') categories = QuerySelectField('Add a category', query_factory=categorychoices, get_label='name') colors = TextAreaField('Colors',validators=[DataRequired()]) description = TextAreaField('Description',validators=[DataRequired()]) image_1= FileField('First Image', validators= [FileAllowed(['jpg','jpeg','png','gif'])]) image_2= FileField('Second Image', validators= [FileAllowed(['jpg','jpeg','png','gif'])]) image_3= FileField('Third Image', validators= [FileAllowed(['jpg','jpeg','png','gif'])]) Submit = SubmitField('Update Product') # 按钮文本改为Update更贴合场景
3. 重构main.py的updateproduct视图函数
你的视图逻辑顺序完全错误:预填表单要在GET请求时执行,提交更新的逻辑需放在form.validate_on_submit()内,同时要正确设置QuerySelectField的data值(需传入对象而非字符串):
@app.route('/updateprod/<int:id>', methods=['POST','GET']) def updateproduct(id): product = Addproduct.query.get_or_404(id) form = AddProducts() # GET请求时预填表单数据 if request.method == "GET": # 普通字段直接赋值 form.name.data = product.name form.price.data = product.price form.discount.data = product.discount form.stock.data = product.stock form.colors.data = product.colors form.description.data = product.description # QuerySelectField需传入对应对象,而非字符串 form.brands.data = product.brand form.categories.data = product.category # POST请求且表单验证通过时,更新数据库 if form.validate_on_submit(): product.name = form.name.data product.price = form.price.data product.discount = form.discount.data product.stock = form.stock.data product.colors = form.colors.data product.description = form.description.data # 直接从表单返回的对象中获取id product.category_id = form.categories.data.id product.brand_id = form.brands.data.id db.session.commit() return redirect(url_for('home')) # 将数据传给模板渲染 return render_template('products/updateproduct.html', form=form, all_products=product)
额外说明
- 移除了多余的
brands = Brand.query.all()和categories = Category.query.all(),因为QuerySelectField已通过query_factory获取选项列表 - 原代码中赋值语句末尾的逗号(如
form.name.data = product.name,)会导致数据变为元组,必须删除 - 表单提交按钮文本改为"Update Product"更符合更新场景
内容的提问来源于stack exchange,提问作者Trishna
相关产品推荐
相关产品推荐

