针对特定变量更新SQLALCHEMY

时间:2014-02-11 16:05:55

标签: python sqlalchemy flask jinja2

基本上这不起作用,因为我认为它正在寻找列表或其他东西。我需要它,用户可以从记录中更新一个变量。我只想更新联系人的姓氏。这可能吗?

错误:

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'

1 个答案:

答案 0 :(得分:1)

正如错误告诉您的那样,form.datadict,而不是可调用的。要访问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。