Вопрос

I get this error below, can anyone help? Let me know if this is not enough info. I have a forms.py, addcontact template, and the below comes from app.py.

Feeback error:

Traceback (most recent call last):
  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 63, in contact_add
,[request.form['mobile']],[request.form['work_location']])
 File "/usr/share/pyshared/sqlalchemy/orm/scoping.py", line 113, in do
   return getattr(self.registry(), name)(*args, **kwargs)
TypeError: add_all() takes exactly 2 arguments (6 given)

My method

@app.route('/addcontact/', methods=['GET','POST'])
def contact_add():
    form = ContactsForm()
    if request.method == 'POST':
        if form.validate() == False:
            flash('All fields are required.')
        else:
            db.session.add_all(request.form['surname'],request.form['firstname'],request.form['email']\
                        ,request.form['mobile'],request.form['work_location'])
            db.session.commit()
            flash("Contact added successfully.")
            return redirect(url_for("contact_list"))
    elif request.method == 'GET':
        return render_template('addcontact.html', title = 'Add Contact',form = form)

This is my contact model:

class Contact(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    surname = db.Column(db.String(100))
    firstname = db.Column(db.String(100))
    email = db.Column(db.String(100))
    mobile = db.Column(db.String(20))
    work_location = db.Column(db.String(100))
    #user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    def __init__(self,surname,firstname,email,mobile,work_location):
        self.surname =  surname
        self.firstname = firstname
        self.email = email
        self.mobile = mobile
        self.work_location = work_location

    def __repr__(self):
        return '<Post %r>' % (self.surname)

This if my contact form:

class ContactsForm(Form):
    surname = fields.TextField(validators=[validators.required()])
    firstname = fields.TextField(validators=[validators.required()])
    email = fields.TextField(validators=[validators.required()])
    mobile = fields.TextField(validators=[validators.required()])
    work_location = fields.TextField(validators=[validators.required()])
Это было полезно?

Решение

Don't add the form field values to the session; SQLAlchemy has no idea what object you are trying to add here.

Instead, create a new Contact object and add that to the session:

if request.method == 'POST':
    if form.validate() == False:
        flash('All fields are required.')
    else:
        contact = Contact(form.data['surname'], form.data['firstname'],
                          form.data['email'], form.data['mobile'], 
                          form.data['work_location'])
        db.session.add(contact)
        db.session.commit()
        flash("Contact added successfully.")
        return redirect(url_for("contact_list"))

You could also remove the __init__ method from your Contact model entirely (SQLAlchemy creates one for you anyway, using keyword arguments instead of required positional arguments):

class Contact(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    surname = db.Column(db.String(100))
    firstname = db.Column(db.String(100))
    email = db.Column(db.String(100))
    mobile = db.Column(db.String(20))
    work_location = db.Column(db.String(100))
    #user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    def __repr__(self):
        return '<Contact %r>' % (self.surname)

and use the Form.populate_obj() function to save yourself having to type out all those fields.

if request.method == 'POST':
    if form.validate() == False:
        flash('All fields are required.')
    else:
        contact = Contact()
        form.populate_obj(contact)
        db.session.add(contact)
        db.session.commit()
        flash("Contact added successfully.")
        return redirect(url_for("contact_list"))

or even:

    else:
        contact = Contact(**form.data)
        db.session.add(contact)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top