2

I have boiled this problem down from a large scale deployment of my DB to the most watered down version I could make yet I am still getting this error.

Below is the code for a VERY SIMPLE database structure using Flask_SQLAlchemy.

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
import os

app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////' + os.path.join(basedir, 'app.db')
app.config['SECRET_KEY'] = 'mysec'

db = SQLAlchemy(app)

class Client(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    clientname = db.Column(db.String(50))
    sessions = db.relationship('Session', backref='client', lazy='dynamic')

    def __repr__(self):
        return '<Client %r>' % (self.clientname)

class Session(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    sessionname = db.Column(db.String(50))
    accept = db.Column(db.String(50))
    client_id = db.Column(db.Integer, db.ForeignKey('client.id'))

    def __repr__(self):
        return '<Session %r>' % (self.sessionname)

admin = Admin(app)
admin.add_view(ModelView(Client, db.session))
admin.add_view(ModelView(Session, db.session))

if __name__ == '__main__':
    app.run(debug=True)

This works fine and the database builds okay. The relationships appear to be okay but yet as soon as I go to Flask-Admin to add a record to either Client or Session when (and only when) there is a record in the other table I get the following error:

[2018-01-16 16:30:17,394] ERROR in app: Exception on /admin/session/new/ [GET]
Traceback (most recent call last):
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/base.py", line 69, in inner
    return self._run_view(f, *args, **kwargs)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/base.py", line 368, in _run_view
    return fn(self, *args, **kwargs)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/model/base.py", line 2024, in create_view
    return_url=return_url)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/base.py", line 308, in render
    return render_template(template, **kwargs)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask/templating.py", line 134, in render_template
    context, ctx.app)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask/templating.py", line 116, in _render
    rv = template.render(context)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/jinja2/environment.py", line 1008, in render
    return self.environment.handle_exception(exc_info, True)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/jinja2/environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/templates/bootstrap2/admin/model/create.html", line 3, in top-level template code
    {% from 'admin/lib.html' import extra with context %} {# backward compatible #}
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/templates/bootstrap2/admin/master.html", line 1, in top-level template code
    {% extends admin_base_template %}
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/templates/bootstrap2/admin/base.html", line 35, in top-level template code
    {% block page_body %}
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/templates/bootstrap2/admin/base.html", line 64, in block "page_body"
    {% block body %}{% endblock %}
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/templates/bootstrap2/admin/model/create.html", line 22, in block "body"
    {% block create_form %}
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/templates/bootstrap2/admin/model/create.html", line 23, in block "create_form"
    {{ lib.render_form(form, return_url, extra(), form_opts) }}
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/jinja2/runtime.py", line 579, in _invoke
    rv = self._func(*arguments)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/templates/bootstrap2/admin/lib.html", line 212, in template
    {% call form_tag(action=action) %}
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/jinja2/runtime.py", line 579, in _invoke
    rv = self._func(*arguments)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/templates/bootstrap2/admin/lib.html", line 191, in template
    {{ caller() }}
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/jinja2/runtime.py", line 579, in _invoke
    rv = self._func(*arguments)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/templates/bootstrap2/admin/lib.html", line 213, in template
    {{ render_form_fields(form, form_opts=form_opts) }}
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/jinja2/runtime.py", line 579, in _invoke
    rv = self._func(*arguments)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/templates/bootstrap2/admin/lib.html", line 183, in template
    {{ render_field(form, f, kwargs) }}
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/jinja2/runtime.py", line 579, in _invoke
    rv = self._func(*arguments)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/templates/bootstrap2/admin/lib.html", line 137, in template
    {{ field(**kwargs)|safe }}
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/wtforms/fields/core.py", line 153, in __call__
    return self.meta.render_field(self, kwargs)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/wtforms/meta.py", line 56, in render_field
    return field.widget(field, **render_kw)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/form/widgets.py", line 28, in __call__
    return super(Select2Widget, self).__call__(field, **kwargs)
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/wtforms/widgets/core.py", line 287, in __call__
    for val, label, selected in field.iter_choices():
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/contrib/sqla/fields.py", line 109, in iter_choices
    for pk, obj in self._get_object_list():
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/contrib/sqla/fields.py", line 102, in _get_object_list
    self._object_list = [(text_type(get_pk(obj)), obj) for obj in query]
  File "/home/maingame/come_flask_obt/env/local/lib/python2.7/site-packages/flask_admin/contrib/sqla/fields.py", line 299, in get_pk_from_identity
    cls, key = identity_key(instance=obj)
ValueError: too many values to unpack
halfer
  • 19,824
  • 17
  • 99
  • 186
  • 1
    https://github.com/flask-admin/flask-admin/issues/1583 – Doobeh Jan 16 '18 at 20:06
  • 1
    Adding `sqlalchemy==1.2.0b3` to your `requirements.txt` will fix it-- the problem was caused by SQLAlchemy updating, causing a change that Flask-Admin's code now doesn't expect. Installing a slightly older version of SQLAlchemy will keep you running until everyone's caught up. – Doobeh Jan 16 '18 at 20:36
  • @Doobeh This should be added as an answer I think. This problem is definitely very common now. – Sergey Shubin Jan 17 '18 at 07:03
  • @Doobeh thank you this solved the problem. I will add as answer. Seems to be more common a problem than some would think. – jgillespie484848 Jan 17 '18 at 10:11

2 Answers2

2

Thanks to @Doobeh my problem was solved by simply adding 'sqlalchemy==1.2.0b3' to my requirements.txt and installing it. Newer versions of SQLAlchemy seem not to work with certain relationship types with Flask-Admin.

https://github.com/flask-admin/flask-admin/issues/1583

2

The issue should be fixed by now. According to https://github.com/flask-admin/flask-admin/issues/1583 Flask-Admin should work just fine with newer versions of sqlalchemy if you pull it directly from the master branch.

MrLeeh
  • 5,321
  • 6
  • 33
  • 51
  • 1
    Flask-Admin version 1.5.1 was released recently. The bug was fixed in it. Looks like this answer should be promoted now. – Sergey Shubin Mar 06 '18 at 06:44