2014-02-11 97 views
0

基本上這是行不通的,因爲我認爲它尋找一個列表或其他東西。我需要它,用戶可以從記錄更新一個變量..我只是想更新聯繫人的姓氏。這可能嗎?SQLALCHEMY更新指定變量

錯誤:

File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__ 

return self.wsgi_app(environ, start_response) 

File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app 

response = self.make_response(self.handle_exception(e)) 

File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception 

reraise(exc_type, exc_value, tb) 

File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app 

response = self.full_dispatch_request() 

File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request 

rv = self.handle_user_exception(e) 

File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception 

reraise(exc_type, exc_value, tb) 

File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request 

rv = self.dispatch_request() 

File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request 

return self.view_functions[rule.endpoint](**req.view_args) 

File "/home/rob/webappan2/addressbook/app.py", line 90, in contact_edit 

contact.surname = form.data('surname') 

TypeError: 'dict' object is not callable 

我的編輯方法:

#edit the contact 
@app.route('/edit/<int:contact_id>',methods=['GET','POST']) 
#GET - Requests data from a specified resource 
def contact_edit(contact_id): 
     form = ContactsForm() 
     if request.method == 'POST': 
      contact = db.session.query(Contact).filter_by(id=contact_id).all() 
      contact.surname = form.data('surname') 
      contact.firstname = form.data('firstname') 
      contact.email = form.data('email') 
      contact.mobile = form.data('mobile') 
      contact.work_location = form.data('work_location') 
      db.session.commit() 
      flash('The contact was successfully edited') 
      return redirect(url_for('contact_detail',contact_id=contact_id)) 
     elif request.method != 'POST': 
      contacts=db.session.query(Contact).filter_by(id=contact_id).all() 
      return render_template('editcontact.html', contacts=contacts, form=form) 

變化在於:改變後

#edit the contact 
@app.route('/edit/<int:contact_id>',methods=['GET','POST']) 
#GET - Requests data from a specified resource 
def contact_edit(contact_id): 
    form = ContactsForm(request.POST) 
    if form.validate_on_submit(): 
     contact = db.session.query(Contact).filter_by(id=contact_id).all() 
     form.populate_obj(contact) 
     db.session.commit() 
     flash('The contact was successfully edited') 
     return redirect(url_for('contact_detail',contact_id=contact_id)) 
    else: 
     contacts=db.session.query(Contact).filter_by(id=contact_id).all() 
     return render_template('editcontact.html', contacts=contacts, form=form) 

錯誤:

File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request 

    return self.view_functions[rule.endpoint](**req.view_args) 

    File "/home/rob/webappan2/addressbook/app.py", line 87, in contact_edit 

    form = ContactsForm(request.POST) 

    File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 338, in __getattr__ 

    return getattr(self._get_current_object(), name) 

    AttributeError: 'Request' object has no attribute 'POST' 
+0

你是什麼意思的「不工作」?如果您遇到錯誤,請分享錯誤和追蹤。 – dirn

+0

謝謝我應該更清楚了 – Lorbat

+0

請幫忙:'( – Lorbat

回答

1

由於錯誤告訴你,form.data是一個dict,不是一個可調用的。要訪問form.data中的值,可以使用form.data['surname']。如果您使用的是WTForms,那麼最好切換到form.surname.data

在代碼正常工作之前,還需要更改其他一些內容。您需要將請求數據傳遞給您的表單。您需要將form = ContactForm()更改爲form = ContactForm(request.form)。如果不這樣做,form包含的所有值將爲空或指定的默認值。

進行此更改後,您很可能可以將您的所有contact.X = form.X.data作業減至只需致電form.populate_obj(contact)

最後,您還需要驗證數據。如代碼所示,引入這些更改將允許通過表單傳遞的無效數據覆蓋已存儲在數據庫中的內容。 (就目前而言,您的代碼會用空白/默認值覆蓋數據庫中的內容。)在您的if request.method == 'POST':內部,您應該包含if form.validate():檢查。如果您使用的是Flask-WTF,則可以將這兩個if組合成一個單獨的if form.validate_on_submit():

P.S.所有代碼特定的建議都假定爲WTForms。

+0

感謝你的提問,雖然它在使用ContactForm時會引起錯誤(request.POST) – Lorbat

+0

我已經按照你的建議進行了修改,是的它的WTF表格 – Lorbat

+0

I修正了這個例子,它應該是'request.form',而不是'request.POST'。 – dirn