#flask #flask-sqlalchemy #flask-wtforms
Вопрос:
я пытаюсь добавить экземпляр объекта через форму к другому объекту. я продолжаю получать эту ошибку.
sqlalchemy.orm.exc.UnmappedInstanceError: Class 'app.forms.Checkout' is not mapped
я смог добиться того, чего хотел, с помощью оболочки python здесь, но этот же подход не сработал из моего routes.py
файла
Вот мой routes.py
@app.route('/checkout', methods=['GET', 'POST']) def checkout(): order = Customerorder.query.first() form = Checkout(request.form) if request.method == "POST": first_name = form.first_name.data last_name = form.last_name.data address = form.address.data contact = form.contact.data payment = form.payment.data #customerorder = request.form.get('customerorder') print(customerorder) new_checkout = Checkout(first_name=first_name, last_name=last_name, address=address, contact=contact, payment=payment, customerorder=order) db.session.add(new_checkout) db.session.commit() session.pop('Shoppingcart') flash(f'You order has been sent. Your order will be delivered soon.') return redirect(url_for('cart')) return render_template('checkout.html', form=form, order=order)
вот мой checkout.html
{% extends "base.html" %} {% block content %} lt;div class="container"gt; lt;div class="row"gt; lt;div class="col-md-8 order-md-1"gt; lt;h4 class="mb-3"gt;Customer informationlt;/h4gt; {{ form.csrf_token }} {% from "_formhelpers.html" import render_field %} lt;form action="" method="POST"gt; {{ render_field(form.first_name, class="form-control", placeholder="first name", label="name") }} {{ render_field(form.last_name, class="form-control", placeholder="last name") }} {{ render_field(form.address, class="form-control", placeholder="address") }} {{ render_field(form.contact, class="form-control", placeholder="Customer contact") }} {{ render_field(form.payment, class="form-control") }} lt;hrgt; lt;select name="customerorder" id="customerorder" class="form-control m-2" requiredgt; lt;option value="{{order.id}}"gt;{{order.invoice}}lt;/optiongt; lt;/selectgt; lt;brgt; lt;button type="submit" class="btn btn-outline-info f-text"gt;Send orderlt;/buttongt; lt;/formgt; lt;/divgt; lt;/divgt; {% include "_messages.html"%} lt;/divgt; {% endblock %}
вот мой models.py
class Customerorder(db.Model): id = db.Column(db.Integer, primary_key=True) invoice = db.Column(db.String(20), unique=True, nullable=False) status = db.Column(db.String(20), default='Pending', nullable=False) date_created = db.Column( db.DateTime, default=datetime.utcnow, nullable=False) orders = db.Column(JsonEcodedDict) def __repr__(self): return f"{self.invoice} | {self.date_created}" class Checkout(db.Model): id = db.Column(db.Integer, primary_key=True) first_name = db.Column(db.String(64), index=True, unique=False) last_name = db.Column(db.String(64), index=True, unique=False) address = db.Column(db.String(64), index=True, unique=False) contact = db.Column(db.Integer(), index=True, unique=False) payment = db.Column(db.String(20), index=True, unique=False) customerorder_id = db.Column(db.Integer, db.ForeignKey('customerorder.id')) customerorder = db.relationship("Customerorder", backref=db.backref("customerorder", uselist=False))
вот мой forms.py
class Checkout(Form): first_name = StringField('First Name', [validators.DataRequired()]) last_name = StringField('Last Name', [validators.DataRequired()]) address = StringField('Address', [validators.DataRequired()]) contact = StringField('contact', [validators.DataRequired()]) payment = SelectField(choices=[('card', 'Online'), ('cash', 'Cash')])
Кто-нибудь может помочь мне понять, что я сделал не так?
Комментарии:
1.
Checkout
Класс в вашем маршруте-это форма, но вы пытаетесь использовать его как форму и как модель. Убедитесь, что вы импортируете оба класса с разными именами или, что еще лучше, с их пространствомmodels.Checkout
имен,forms.Checkout
.2. Блин. Это было глупое соглашение об именах с моей стороны. Спасибо, что указали на это.