dpgaspar / Flask-AppBuilder

Simple and rapid application development framework, built on top of Flask. includes detailed security, auto CRUD generation for your models, google charts and much more. Demo (login with guest/welcome) - http://flaskappbuilder.pythonanywhere.com/
BSD 3-Clause "New" or "Revised" License
4.65k stars 1.36k forks source link

Arrays throw: jinja2.exceptions.UndefinedError: 'None' has no attribute 'label' #1463

Closed KonradHoeffner closed 3 years ago

KonradHoeffner commented 4 years ago

Environment

Flask-Appbuilder version: 3.0.1 Arch Linux with Python 3.8.5 (Python 2 not installed)

pip freeze output:

apispec==3.3.2
attrs==20.1.0
Babel==2.8.0
click==7.1.2
colorama==0.4.3
defusedxml==0.6.0
dnspython==2.0.0
email-validator==1.1.1
Flask==1.1.2
Flask-AppBuilder==3.0.1
Flask-Babel==1.0.0
Flask-JWT-Extended==3.24.1
Flask-Login==0.4.1
Flask-OpenID==1.2.5
Flask-SQLAlchemy==2.4.4
Flask-WTF==0.14.3
idna==2.10
itsdangerous==1.1.0
Jinja2==2.11.2
jsonschema==3.2.0
MarkupSafe==1.1.1
marshmallow==3.7.1
marshmallow-enum==1.5.1
marshmallow-sqlalchemy==0.23.1
prison==0.1.3
PyJWT==1.7.1
pyrsistent==0.16.0
python-dateutil==2.8.1
python3-openid==3.2.0
pytz==2020.1
PyYAML==5.3.1
six==1.15.0
SQLAlchemy==1.3.19
SQLAlchemy-Utils==0.36.8
Werkzeug==1.0.1
WTForms==2.3.3

Describe the expected results

Users should be able to view and edit Arrays.

Describe the actual results

Tell us what happens instead. An exception is thrown whenever I use an array.

2020-09-01 14:02:01,978:ERROR:app:Exception on /softwareproductview/add [GET]
Traceback (most recent call last):
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask_appbuilder/security/decorators.py", line 109, in wraps
    return f(self, *args, **kwargs)
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask_appbuilder/views.py", line 588, in add
    return self.render_template(
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask_appbuilder/baseviews.py", line 280, in render_template
    return render_template(
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask/templating.py", line 137, in render_template
    return _render(
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask/templating.py", line 120, in _render
    rv = template.render(context)
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/jinja2/environment.py", line 1090, in render
    self.environment.handle_exception()
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/jinja2/environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/jinja2/_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask_appbuilder/templates/appbuilder/general/model/add.html", line 2, in top-level template code
    {% import 'appbuilder/general/lib.html' as lib %}
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask_appbuilder/templates/appbuilder/base.html", line 1, in top-level template code
    {% extends base_template %}
  File "/home/konrad/projekte/hito/database-frontend/app/templates/base.html", line 1, in top-level template code
    {% extends 'appbuilder/baselayout.html' %}
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask_appbuilder/templates/appbuilder/baselayout.html", line 2, in top-level template code
    {% import 'appbuilder/baselib.html' as baselib %}
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask_appbuilder/templates/appbuilder/init.html", line 46, in top-level template code
    {% block body %}
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask_appbuilder/templates/appbuilder/baselayout.html", line 19, in block "body"
    {% block content %}
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask_appbuilder/templates/appbuilder/general/model/add.html", line 7, in block "content"
    {% block add_form %}
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask_appbuilder/templates/appbuilder/general/model/add.html", line 8, in block "add_form"
    {{ widgets.get('add')(form_action=form_action)|safe }}
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask_appbuilder/widgets.py", line 37, in __call__
    return template.render(args)
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/jinja2/environment.py", line 1090, in render
    self.environment.handle_exception()
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/jinja2/environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/jinja2/_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask_appbuilder/templates/appbuilder/general/widgets/form.html", line 45, in top-level template code
    {{ lib.render_field(field, begin_sep_label, end_sep_label, begin_sep_field, end_sep_field) }}
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/jinja2/runtime.py", line 679, in _invoke
    rv = self._func(*arguments)
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/flask_appbuilder/templates/appbuilder/general/lib.html", line 230, in template
    {{ field.label.text }}
  File "/home/konrad/projekte/hito/database-frontend/venv/lib/python3.8/site-packages/jinja2/environment.py", line 471, in getattr
    return getattr(obj, attribute)
jinja2.exceptions.UndefinedError: 'None' has no attribute 'label'
2020-09-01 14:02:01,981:INFO:werkzeug:127.0.0.1 - - [01/Sep/2020 14:02:01] "GET /softwareproductview/add HTTP/1.1" 500 -

Steps to reproduce

views.py

from flask_appbuilder import Model
from sqlalchemy import Column, String
import sqlalchemy.dialects.postgresql as pg

class Softwareproduct(Model):
    suffix = Column(String(200), primary_key=True)
    databasesystems =  Column(pg.ARRAY(String),nullable=False)

models.py

```python
from flask import render_template
from flask_appbuilder.models.sqla.interface import SQLAInterface
from flask_appbuilder import ModelView, ModelRestApi

from . import appbuilder, db
from .models import Softwareproduct

class SoftwareproductView(ModelView):
    datamodel = SQLAInterface(Softwareproduct)

@appbuilder.app.errorhandler(404)
def page_not_found(e):
    return (
        render_template(
            "404.html", base_template=appbuilder.base_template, appbuilder=appbuilder
        ),
        404,
    )

appbuilder.add_view(
    SoftwareproductView,
    "Software Product",
    icon = "fa-folder-open-o",
    category = "Software Product",
    category_icon = "fa-envelope"
)
```

Call flask run and then open http://127.0.0.1:5000/softwareproductview/add

stale[bot] commented 3 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 7 days if no further activity occurs. Feel free to reopen it if it's still relevant to you. Thank you