Flask 烧瓶从另一张桌子上取下物品

Flask 烧瓶从另一张桌子上取下物品,flask,flask-sqlalchemy,Flask,Flask Sqlalchemy,我有一个包含食谱和配料的数据库: class Recipe(db.Model): id = db.Column(db.Integer, primary_key=True) ingredient = db.relationship('Ingredient', backref='ingredientrecipe', lazy=True) recipe_name = db.Column(db.String(100), nullable=False) class Ingredi

我有一个包含食谱和配料的数据库:

class Recipe(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    ingredient = db.relationship('Ingredient', backref='ingredientrecipe', lazy=True)
    recipe_name = db.Column(db.String(100), nullable=False)

class Ingredient(db.Model):
    id = db.Column(db.Integer, primary_key=True) 
    recipe_id = db.Column(db.Integer, db.ForeignKey('recipe.id'), nullable=False)
    name = db.Column(db.String(100))
成分列在html表格中。(为了清楚起见,我没有为modal包含完整的引导html,尽管它显示了一些奇怪的行为,尽管它有一个唯一的id)


#
名称
{component.items%中成分的百分比}
{{hop.id}
{{component.name}
{%endfor%}
以下是我的删除路线:

@app.route('/recipe/<int:ingredient_id>/delete', methods=['POST'])
@login_required
def deleteingredient(ingredient_id):
    recipe = Recipe.query.get_or_404(recipe_id)
    ingredient = Ingredient.query.filter_by(ingredientrecipe=recipe)
    if recipe.author != current_user:
        abort(403)
    db.session.delete(ingredient)
    db.session.commit()
    flash('Your ingredient has been deleted', 'success')
@app.route('/recipe//delete',methods=['POST'])
@需要登录
def删除成分(成分id):
recipe=recipe.query.get_或_404(recipe_id)
配料=配料.查询.筛选依据(IngredCenter=配方)
如果recipe.author!=当前用户:
中止(403)
db.session.delete(成分)
db.session.commit()
flash('您的成分已被删除','成功')
我不打算在尝试这样做时发布错误消息,因为我认为这是不相关的(这是一个
(sqlite3.integrityyror)NOTNULL约束在与
配方相关的另一个表上失败了
),可能会混淆问题

想要的行为是转到单个配方页面,单击配料列表单行上的按钮,弹出模式,并从数据库中删除单个配料行


我很确定这是因为我不理解数据库结构背后的逻辑以及路由如何与相关表一起工作。如果能帮我减轻大脑损伤,我将不胜感激

通过查看您的代码,我可以发现一些可能破坏逻辑的问题:

  • 删除成分
    函数中,您从未使用
    成分id
  • 未定义配方id

配方
模型中的
成分
关系的目的是什么?因为一个配方有几个成分,一个成分可以有几个配方,这是一个n-n关系。也许你应该考虑一下< /p> < p>这是今天早上工作的代码。< /P> 我对NOTNULL的问题是由于该路由与delete recipe路由的地址相同,所以它也在做同样的事情。我认为这是一个模态问题,所以花了一些时间研究引导模态,结果证明我在前端的一切都是正确的

添加了成分行之后,我开始获得一些适当的调试信息,从那里开始就相对简单了

@app.route('/recipe/ingredient/<int:ingredient_id>/delete', methods=['POST'])
@login_required
def deleteingredient(ingredient_id):
    ingredient = Ingredient.query.get_or_404(ingredient_id)
    db.session.delete(ingredient)
    db.session.commit()
    flash('Your ingredient has been deleted', 'success')
    return redirect(url_for('recipe', recipe_id=ingredient.recipe_id))
@app.route('/recipe/component//delete',methods=['POST'])
@需要登录
def删除成分(成分id):
配料=配料.查询.获取配料或配料404(配料id)
db.session.delete(成分)
db.session.commit()
flash('您的成分已被删除','成功')
返回重定向(url_for('recipe',recipe_id=component.recipe_id))

这种关系是一对多的-每种成分只存在于该配方中(它是从成分主表复制的)。因此,一份食谱可以有多种成分,但反过来就不行了。如果你是食谱的材料,谢谢,一旦我的大脑恢复正常,我会再次检查这个问题。今天的工作已经太多了!谢谢你的建议@Mathieu-我现在已经明白了。现在,我必须考虑如何删除一个食谱和它的相应成分(从4个不同的表!),这将是有趣的!
@app.route('/recipe/ingredient/<int:ingredient_id>/delete', methods=['POST'])
@login_required
def deleteingredient(ingredient_id):
    ingredient = Ingredient.query.get_or_404(ingredient_id)
    db.session.delete(ingredient)
    db.session.commit()
    flash('Your ingredient has been deleted', 'success')
    return redirect(url_for('recipe', recipe_id=ingredient.recipe_id))