【问题标题】:Flask SQLAlchemy - not updating, just adding a new recordFlask SQLAlchemy - 不更新,只是添加新记录
【发布时间】:2020-02-26 00:08:54
【问题描述】:

我正在编写一个简单的应用程序,用于使用 Flask-SQLAlchemy 向 sqlite3 数据库添加和更新信息。现在我有一个大问题,因为我无法更新数据库,它只是每次提交表单按钮时都会添加一条新记录。

这是我的代码:

@main.route("/invoices", methods=["GET", "POST"], defaults={"invoice_id": None})
@main.route("/invoices/<int:invoice_id>", methods=["GET", "POST"])
def invoices(invoice_id):
    invoice = None

    if invoice_id:
        invoice = Invoice.query.get_or_404(invoice_id)

    if request.method == "POST":
        date = request.form["date"]
        name = request.form["name"]
        value = request.form["value"]
        currency = request.form["currency"]
        payment = request.form["payment"]
        category = request.form["category"]
        description = request.form["description"]

        if invoice:
            invoice.date = datetime.strptime(date, "%Y-%m-%d")
            invoice.name = name
            invoice.value = value
            invoice.currency = currency
            invoice.payment = payment
            invoice.category = category
            invoice.description = description

        else:
            invoice = Invoice(
                date=datetime.strptime(date, "%Y-%m-%d"),
                name=name,
                value=value,
                currency=currency,
                payment=payment,
                category=category,
                description=description,
            )
            db.session.add(invoice)

        db.session.commit()

        return redirect(url_for("main.invoices", invoice_id=invoice.id))

    currencies = Currency.query.all()
    payments = Payment.query.all()
    categories = Category.query.all()

    context = {
        "invoice_id": invoice_id,
        "currencies": currencies,
        "payments": payments,
        "categories": categories,
        "invoice": invoice,
    }

    return render_template("invoices.html", **context)

我不知道如何更新数据,因为它总是添加一条新记录,现在只提交现有或更改的字段。也许我的 if 语句有问题...

请帮我完成这项任务...

这是模型:

class Invoice(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    value = db.Column(db.Integer)
    date = db.Column(db.DateTime)
    name = db.Column(db.String(50))
    description = db.Column(db.String(100))
    currency = db.Column(db.ForeignKey("currency.id"))
    payment = db.Column(db.ForeignKey("payment.id"))
    category = db.Column(db.ForeignKey("category.id"))


class Currency(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(10))


class Payment(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))


class Category(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))

【问题讨论】:

  • 你也可以分享你的模型类吗?
  • @tedivm:我添加了上面的模型。

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案1】:

这段代码可能对你有帮助

@main.route("/invoices", methods=["GET", "POST"], defaults={"invoice_id": None})
@main.route("/invoices/<int:invoice_id>", methods=["GET", "POST"])
def invoices(invoice_id):
    invoice = None

    if invoice_id is not None:
        invoice = Invoice.query.filter_by(id=invoice_id).first()

    if request.method == "POST":
        date = request.form["date"]
        name = request.form["name"]
        value = request.form["value"]
        currency = request.form["currency"]
        payment = request.form["payment"]
        category = request.form["category"]
        description = request.form["description"]

        if invoice is not None:
            invoice.date = datetime.strptime(date, "%Y-%m-%d")
            invoice.name = name
            invoice.value = value
            invoice.currency = currency
            invoice.payment = payment
            invoice.category = category
            invoice.description = description

        else:
            invoice = Invoice(
                date=datetime.strptime(date, "%Y-%m-%d"),
                name=name,
                value=value,
                currency=currency,
                payment=payment,
                category=category,
                description=description,
            )
            db.session.add(invoice)

        db.session.commit()

        return redirect(url_for("main.invoices", invoice_id=invoice.id))

    currencies = Currency.query.all()
    payments = Payment.query.all()
    categories = Category.query.all()

    context = {
        "invoice_id": invoice_id,
        "currencies": currencies,
        "payments": payments,
        "categories": categories,
        "invoice": invoice,
    }

    return render_template("invoices.html", **context)

【讨论】:

  • 好吧,我帮不上忙。在模型中Invoice有属性Invoice.id,所以我猜应该是这样的invoice = Invoice.query.filter_by(id=invoice_id).first()
猜你喜欢
  • 1970-01-01
  • 2022-01-06
  • 2018-07-13
  • 2017-11-25
  • 2016-10-16
  • 1970-01-01
  • 2018-06-08
  • 2023-03-06
  • 2020-10-03
相关资源
最近更新 更多