Flask SQLAlchemy - не обновляется, просто добавляется новая запись - PullRequest
0 голосов
/ 26 февраля 2020

Я пишу простое приложение для добавления и обновления информации в базе данных sqlite3 с использованием Flask -SQLAlchemy. Теперь у меня большая проблема, потому что я не могу обновить базу данных, она просто добавляет новую запись каждый раз, когда я отправляю кнопку формы.

Вот мой код:

@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))

1 Ответ

0 голосов
/ 26 февраля 2020

Этот код может вам помочь

@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)
...