2016-03-26 15 views
-1

Ich versuche eine Seite zu haben, auf der Kunden die Seite und die Menge eines bestimmten Menüpunktes auswählen können und sie zu ihrer Bestellung hinzufügen können. Ich laufe in Mühe versuche, es zu meiner Datenbank zu senden ... egal was ich versuche, ein Attribut Sprüche geworfen wird, was Objekt kein Attribut ‚_sa‘ hat ...'Unicode' -Objekt hat kein Attribut '_sa_instance_state'

Hier sind meine Modelle:

class MenuItems(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50), index=True, unique=True) 
    category = db.Column(db.String(50)) 
    price = db.Column(db.Float(6)) 
    description = db.Column(db.String(140)) 
    image_path = db.Column(db.String(140), unique=True) 
    def __unicode__(self): 
     return self.name 

class Orders(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    customer_id = db.Column(db.Integer, db.ForeignKey('customer.id')) 
    created_on = db.Column(db.DateTime) 
    submitted = db.Column(db.Boolean) 
    submitted_on = db.Column(db.DateTime) 
    order_items = db.relationship('OrderItems', backref='orders', lazy='dynamic') 

    def __unicode__(self): 
     return str(self.customer_id) 

class OrderItems(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    order_id = db.Column(db.Integer, db.ForeignKey('orders.id')) 
    menu_item_id = db.Column(db.Integer, db.ForeignKey('menu_items.id')) 
    side_id = db.Column(db.Integer, db.ForeignKey('menu_items.id')) 
    quantity = db.Column(db.Integer) 

    menu_item = db.relationship(MenuItems, foreign_keys=[menu_item_id], 
          backref="menu_item") 
    side_item = db.relationship(MenuItems, foreign_keys=[side_id], 
          backref="side_item") 
    def __unicode__(self): 
     return str(self.id) 

Und die Form:

class OrderForm(Form): 
    side = SelectField(u'MenuItem', validators=[DataRequired()]) 
    quantity = IntegerField(default=1) 
    submit = SubmitField("Add to Order") 

    def __init__(self, *args, **kwargs): 
     Form.__init__(self, *args, **kwargs) 

    def validate(self): 
     if not Form.validate(self): 
      return False 

die entsprechenden Ansichten:

@login_required 
@davesbread.route('/detail/<menu_item_name>', methods=['GET', 'POST']) 
def detail(menu_item_name): 
    form = OrderForm() 
    form.side.choices=[(s.id, s.name) for s in 
        MenuItems.query.filter_by(category='side').all()] 
    menu_item = MenuItems.query.filter_by(name=menu_item_name).first_or_404() 
    if form.validate_on_submit(): 
     add_to_order(menu_item.id) 
    return render_template('customer/detail.html', title="Dave's Bread - " + menu_item.name, 
          menu_item=menu_item, form=form, user=current_user) 

@login_required 
@davesbread.route('/add_to_order/<menu_item_id>', methods=['GET', 'POST']) 
def add_to_order(menu_item_id): 
    id = menu_item_id 
    form = OrderForm() 
    side = form.side.data 
    quantity = form.quantity.data 
    if current_user.is_anonymous: 
     return redirect(url_for('login')) 
    menu_item = MenuItems.query.filter_by(id=id).first() 
    order_exists = order_loader() 
    if order_exists: 
     order = Orders.query.filter_by(customer_id=current_user.id).first() 
     order_item = OrderItems(menu_item=menu_item, quantity=quantity, 
           side_item=side) 
     order.order_items.append(order_item) 
     db.session.add(order) 
     db.session.commit() 
    else: 
     order_item = OrderItems(menu_item=menu_item, quantity=quantity, 
           side_item=side) 
     order = Orders(customer_id=current_user.id, 
         created_on=datetime.datetime.now(), 
         submitted=False) 
     order.order_items.append(order_item) 
     db.session.add(order) 
     db.session.commit() 
     session['cart'] = True 
     flash('Item added to order') 
    return redirect(url_for('menu', category=menu_item.category)) 

die Vorlage:

{% extends "base.html" %} 

{% block content %} 

<table> 
    <tr> 
    <td> 
     <img src="{{ menu_item.image_path }}"> 
    </td> 
    <td> 
     <h3>{{ menu_item.name }}</h3> 
     <br> 
     <p> {{ menu_item.description }}</p> 
    </td> 
    <td> 
     <form action="{{ url_for('add_to_order', menu_item_id=menu_item.id) }}" 
      method=post> 
     {{ form.hidden_tag() }} 

     {{ form.side }} 

     {{ form.quantity.label }} 
     {{ form.quantity }} 

     {{ form.submit }} 
     </form> 
    </td> 
    </tr> 
<table> 

{% endblock %} 

Hier ist die Zurückverfolgungs: https://gist.github.com/baccb79b31728e63f252

Was diesen Fehler verursacht? Vielen Dank im Voraus :)

Antwort

0

Ich glaube, das Problem ist wie beschrieben here: Sie übergeben Zeichenfolge als Parameter des Konstruktors an einer Stelle, wo Objekt erwartet wird (d. H. Entsprechendes Feld ist eine Beziehung und keine Zeichenfolge-Spalte).

Zum Beispiel können diese Linien geben Sie diesen Fehler:

side = form.side.data 
# here side is a string 

# ... 

    order_item = OrderItems(menu_item=menu_item, quantity=quantity, 
          side_item=side) 

# here side_item is expected to be an object 
# as it is defined as a relationship in the model 

Sie haben side in side_item=side mit entsprechenden MenuItems Instanz zu ersetzen, die durch side Wert abgefragt wird.

+0

Funktioniert perfekt. Ersetzen Seite mit einem abgefragten Artikel ist, was ich fehlte Danke Lasten –

+0

Bitte akzeptieren Sie eine funktionierende Lösung. –

Verwandte Themen