Simple and extensible administrative interface framework for Flask

Overview

Flask-Admin

The project was recently moved into its own organization. Please update your references to [email protected]:flask-admin/flask-admin.git.

https://travis-ci.org/flask-admin/flask-admin.svg?branch=master

Introduction

Flask-Admin is a batteries-included, simple-to-use Flask extension that lets you add admin interfaces to Flask applications. It is inspired by the django-admin package, but implemented in such a way that the developer has total control of the look, feel and functionality of the resulting application.

Out-of-the-box, Flask-Admin plays nicely with various ORM's, including

It also boasts a simple file management interface and a redis client console.

The biggest feature of Flask-Admin is flexibility. It aims to provide a set of simple tools that can be used for building admin interfaces of any complexity. So, to start off with you can create a very simple application in no time, with auto-generated CRUD-views for each of your models. But then you can go further and customize those views & forms as the need arises.

Flask-Admin is an active project, well-tested and production ready.

Examples

Several usage examples are included in the /examples folder. Please add your own, or improve on the existing examples, and submit a pull-request.

To run the examples in your local environment:

1. Clone the repository::

      git clone https://github.com/flask-admin/flask-admin.git
      cd flask-admin

2. Create and activate a virtual environment::

      virtualenv env -p python3
      source env/bin/activate

3. Install requirements::

      pip install -r examples/sqla/requirements.txt

4. Run the application::

      python examples/sqla/run_server.py

Documentation

Flask-Admin is extensively documented, you can find all of the documentation at https://flask-admin.readthedocs.io/en/latest/.

The docs are auto-generated from the .rst files in the /doc folder. So if you come across any errors, or if you think of anything else that should be included, then please make the changes and submit them as a pull-request.

To build the docs in your local environment, from the project directory:

tox -e docs-html

And if you want to preview any .rst snippets that you may want to contribute, go to http://rst.ninjs.org/.

Installation

To install Flask-Admin, simply:

pip install flask-admin

Or alternatively, you can download the repository and install manually by doing:

git clone [email protected]:flask-admin/flask-admin.git
cd flask-admin
python setup.py install

Tests

Test are run with nose. If you are not familiar with this package you can get some more info from their website.

To run the tests, from the project directory, simply:

pip install -r requirements-dev.txt
nosetests

You should see output similar to:

.............................................
----------------------------------------------------------------------
Ran 102 tests in 13.132s

OK

For all the tests to pass successfully, you'll need Postgres & MongoDB to be running locally. For Postgres:

> psql postgres
CREATE DATABASE flask_admin_test;
\q

> psql flask_admin_test
CREATE EXTENSION postgis;
CREATE EXTENSION hstore;

You can also run the tests on multiple environments using tox.

3rd Party Stuff

Flask-Admin is built with the help of Bootstrap, Select2 and Bootswatch.

If you want to localize your application, install the Flask-BabelEx package.

You can help improve Flask-Admin's translations through Crowdin: https://crowdin.com/project/flask-admin

Comments
  • Add ability to use form_ajax_refs fields as editable columns

    Add ability to use form_ajax_refs fields as editable columns

    Adds support for inline-editing of form_ajax_refs fields from list.html views:

    • One-to-one relationship
      • [x] Ajax search
      • [x] Select2 field
      • [x] Selections/adjustments persist/are saved to db
      • [x] Editable field reflects the updated/selected value from the modal
    • One-to-many relationship
      • [x] Ajax search
      • [x] Select2 multiple field
      • [x] Selections/adjustments persist/are saved to db
      • [x] Editable field does not always reflect the updated (multiple) values once clicking save in the modal. Changes do reflect on refresh though.

    🐛 Both single and multi-select inline editable fields are unable to have all their values deleted from the inline select2 field in the list.html views. This relates to #357 and should be addressed when that issue is addressed.

    Closes #1627 Closes #2063 Closes #2157

    opened by caffeinatedMike 42
  • when there are many rows, some row's Foreign Key will be empty in the list page, It's random

    when there are many rows, some row's Foreign Key will be empty in the list page, It's random

    when there are many rows, some row's Foreign Key will be empty in the list page, It's random.

    It's strange, and when I add a filter to limit the rows num, it will be right.

    I look into the code, but cannot solve the problem.

    opened by dantezhu 29
  • form_create_rules do not work with inline_models

    form_create_rules do not work with inline_models

    I have a ModelView with an inline_model in it. If I render it as is, there is a button I can click to add new instances of the inline model. However, if I specify form_create_rules, the button goes away. I can't find any way to organize my columns into groups without losing that button. What should I do? Can you document the correct parameters for this? Is it possible with the current code base?

    opened by nickretallack 24
  • `SynonymProperty` and `hybrid_property` aren't displayed in the model form

    `SynonymProperty` and `hybrid_property` aren't displayed in the model form

    I used to use db.synonym from sqlalchemy in my model with Flask-Admin 1.0.1. Everything worked fine.

    Recently I tried it with latest master and synonyms aren't rendered in the model form anymore as default converter kind of ignores them now.

    I also tried using hybrid_property as it is superset of synonym. They aren't rendered in the model form at all as they aren't listed in the mapper.iterate_properties.

    Any ideas? Because I'm out of them right now after debugging this (new for me stuff) for a couple of hours.

    opened by dmedvinsky 24
  • contrib.sqlamodel: Inline model lookup should be a bit more flexible

    contrib.sqlamodel: Inline model lookup should be a bit more flexible

    Consider following scenario with three models containing following relations: sale <-> salesitem -> product

    Lets say I want to create a new Sale and also add a new SalesItem it fetches all the products and creates the lookup list. With up to 100 products it works fine, but with around 7000 products it's getting a bit too slow.

    Therefore, some ideas and feature requests:

    • AJAX lookup!
    • Various lookup widgets
      • Current chosen-based dropdown
      • Text field with "find" -> show results box etc..
    • Possibility to specify a column which is used for lookup/display
    opened by plaes 22
  • flask-admin pages inaccessible in production

    flask-admin pages inaccessible in production

    Hi, I did a pretty simple implementation of flask-admin in my flask application, without creating any html pages, with something like this:

    admin = admin.Admin(app, 'App Administration')

    It works really well in development, and I can access the admin pages via mysite.com/admin/ .

    Now, when I want to deploy my app with Apache and mod_wsgi, everything works fine at mysite.com/myapp/ , except flask-admin, which I expected to be available at mysite.com/myapp/admin (but I just get a 404).

    Is there some extra configuration to be done with Apache ? I didn't see anything in the documentation about going into production.

    Here's my Apache configuration:

    <VirtualHost *:443> WSGIDaemonProcess myapp user=myapp group=myapp threads=5 WSGIScriptAlias /myapp /var/www/code/MyApp/wsgi/myapp.wsgi WSGIScriptReloading On WSGIPassAuthorization On SSLEngine on SSLCertificateFile /var/www/code/MyApp/ssl.crt SSLCertificateKeyFile /var/www/code/MyApp/ssl.key SSLVerifyClient None SSLOptions +StdEnvVars <Directory /var/www/code/MyApp/wsgi>                 WSGIProcessGroup myapp                 WSGIApplicationGroup %{GLOBAL}                 Order deny,allow                 Allow from all </Directory>

    </VirtualHost>

    I checked the Apache error log but I don't get any error.

    Thanks for any help.

    opened by Kyrill76 20
  • New release?

    New release?

    Hiho!

    According to #1603 you were about to issue a new release which would make flask-admin compatible with sqlalchemy 1.2+. May I ask when is it going to happen? It would be nice, if I wouldn't had to patch flask-admin myself :)

    Thanks in advance!

    EDIT: I apologize for opening a new issue, but I wasn't sure if I should comment on an already closed issue, which I can't reopen, or open a new one...

    opened by stiefel40k 17
  • Using standard app factory pattern problematic with Flask-Admin's way of using blueprints

    Using standard app factory pattern problematic with Flask-Admin's way of using blueprints

    The example below might not be a very good use of the app factory pattern, but imagine that you're using sqla.ModelView instead. Then we would have to issue admin.add_view() within the create_app flow because we need to pass in the model and database session. Right now I use a workaround found in this SO thread. Is there some way that we could change Flask-Admin's behavior so that we can follow Flask's standard application factory workflow?

    import flask
    import flask_admin
    import unittest
    
    
    class MyAdminView(flask_admin.BaseView):
        @flask_admin.expose('/')
        def index(self):
            self.render('index.html')
    
    
    admin = flask_admin.Admin()
    
    
    def create_app():
        app = flask.Flask(__name__)
        admin.add_view(MyAdminView(name='myview1', endpoint='myview1'))
        admin.init_app(app)
        return app
    
    
    class BlueprintCollisionTestCase(unittest.TestCase):
    
        def setUp(self):
            self.app = create_app()
    
        def test_1(self):
            assert 1 == 1
    
        def test_2(self):
            assert 1 == 1
    
    
    if __name__ == '__main__':
        unittest.main()
    
    $ python testflaskadmin.py
    .F
    ======================================================================
    FAIL: test_2 (__main__.BlueprintCollisionTestCase)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "testflaskadmin.py", line 25, in setUp
        self.app = create_app()
      File "testflaskadmin.py", line 18, in create_app
        admin.add_view(MyAdminView(name='myview1', endpoint='myview1'))
      File "/Users/jacob/venvs/myvenv/lib/python3.4/site-packages/Flask_Admin-1.2.0-py3.4.egg/flask_admin/base.py", line 526, in add_view
        self.app.register_blueprint(view.create_blueprint(self))
      File "/Users/jacob/venvs/myvenv/lib/python3.4/site-packages/flask/app.py", line 62, in wrapper_func
        return f(self, *args, **kwargs)
      File "/Users/jacob/venvs/myvenv/lib/python3.4/site-packages/flask/app.py", line 885, in register_blueprint
        (blueprint, self.blueprints[blueprint.name], blueprint.name)
    AssertionError: A blueprint's name collision occurred between <flask.blueprints.Blueprint object at 0x1018ebc18> and <flask.blueprints.Blueprint object at 0x1018eb2b0>.  Both share the same name "myview1".  Blueprints that are created on the fly need unique names.
    
    ----------------------------------------------------------------------
    Ran 2 tests in 0.003s
    
    FAILED (failures=1)
    
    opened by jacobsvante 16
  • Delete record cause a CSRF missing problem.

    Delete record cause a CSRF missing problem.

    I enabled CSRF checking, and a ModelView is created, when try to delete one record, there is the error,

    Bad Request CSRF token missing or incorrect . How to solve this problem.

    opened by ahksdfhkjh 16
  • Redirect to edit view after creating new model

    Redirect to edit view after creating new model

    This is less confusing for the user because they don't return to a list view which may not actually include the newly created model.

    Changes view.create_model() to return the newly created model, including for all concrete backends.

    opened by longhotsummer 16
  • Multi column sort with column_default_sort

    Multi column sort with column_default_sort

    Currently Flask-Admin doesn't support sorting on multiple columns. Could you implement this?

    column_default_sort = [(Model1.colA, True), ('colB', False)]
    

    and

    column_default_sort = [Model1.colA, 'colB']
    
    opened by Diaoul 16
  • `jinja2.exceptions.UndefinedError: 'flask_admin.model.form.ListForm object' has no attribute`

    `jinja2.exceptions.UndefinedError: 'flask_admin.model.form.ListForm object' has no attribute`

    I've been having an issue with the editable field payment_status. Most of my editable inline models do work. One has been giving me the error above. I have tried swapping for other inline models and haven't been able to replicate the issue. Haven't been able to figure out what's causing the issue.

    Here is the View:

    class TransactionAdminView(AdminView, TransactionView):
        column_list = ('payment_status',)
        column_editable_list = ('payment_status',)
        form_columns = ('customer', 'id', 'price', 'documents',)
        inline_models = (DocumentInlineModelForm(),)
        form_args = dict(id=dict(
            validators=(validators.Regexp(r'^(UPS)|(TACO)\d+[A-Z]{1,4}$',
                                          message="Transaction ID must be formatted 'UPS0XXXX' or 'TACO0XXXX'"),)
        ))
    

    Which is a subclass of

    class TransactionView(BaseAgentView):
        column_labels = {'id': "Transaction ID",
                         'timestamp': "Submitted",
                         'price': "Price (USD)",
                         'customer.email': "Customer Email",
                         'shipping_option': "Shipping",
                         'customer_comments': "Customer Comments",
                         'comments': "Internal Notes",
                         'payment_status.status': "Payment Status"}
        column_searchable_list = ("id", "customer.name", "price", "shipping_option", "customer_comments", "comments")
        column_list = ("id", "customer_name", "timestamp", "shipping_option", "tracking_number", "price",
                       "payment_status.status", "customer_comments", "comments")
        column_sortable_list = column_list
        column_filters = column_list + ('customer.email',)
        column_editable_list = ["tracking_number", "comments"]
    
        column_default_sort = ("timestamp", True)
    
        def _price_formatter(view, context, model, name):
            if model.price:
                markup_string = "%.2f" % model.price
                return Markup(markup_string)
            else:
                return ""
    
        def _date_formatter(view, context, model, name):
            if model.timestamp:
                markup_string = format_datetime(model.timestamp)
                return Markup(markup_string)
    
        def _id_formatter(view, context, model, name):
            if view.__class__.__name__.find('Admin') > 0:
                route = "document-admin.index_view"
            else:
                route = "document.index_view"
            markup_string = f"<a href='{url_for(route, flt2_40=model.id)}'>{model.id}</a>"
            return Markup(markup_string)
    
        def _name_formatter(view, context, model, name):
            if view.__class__.__name__.find('Admin') > 0:
                route = "customer-admin.index_view"
            else:
                route = "customer.index_view"
            markup_string = f"<a href='{url_for(route, flt0_16=model.customer.email)}'>{model.customer_name}</a>"
            return Markup(markup_string)
    
        column_formatters = {
            'price': _price_formatter,
            'timestamp': _date_formatter,
            'id': _id_formatter,
            'customer_name': _name_formatter
        }
    

    where BaseView and AdminView are subclasses of sqla.ModelView. These views are derived from the sqlalchemy model:

    class Transaction(db.Model):
    
        prefix = db.Column(db.String, nullable=False)
        counter = db.Column(db.Integer, primary_key=True)
    
        id = db.Column(db.String, unique=True)
        timestamp = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    
        price = db.Column(db.Float, nullable=False, default=0)
        payment_status_id = db.Column(db.Integer, db.ForeignKey('payment_status.id', ondelete='CASCADE'))
        payment_status = db.relationship('PaymentStatus', uselist=False)
    
        shipping_option = db.Column(db.String, nullable=True)
        tracking_number = db.Column(db.String, nullable=True)
        customer_comments = db.Column(db.String, nullable=True)
    
        comments = db.Column(db.String, nullable=True)
    
        customer_id = db.Column(db.Integer, db.ForeignKey('customer.id', ondelete='CASCADE'), nullable=False)
        customer = db.relationship('Customer',
                                   backref=db.backref('transactions', lazy=True,
                                                      cascade='all,delete', passive_deletes=True))
    
        @hybrid_property
        def customer_name(self):
            return self.customer.name
    
        @customer_name.expression
        def customer_name(cls):
            return select([ColumnOperators.concat(ColumnOperators.concat(Customer.name_first, " "), Customer.name_last)]).\
                where(cls.customer_id == Customer.id).label("customer_name")
    
        @validates('prefix')
        def validate_prefix(self, key, prefix):
            if not bool(match(r'^[A-Z]{3,4}$', str(prefix))):
                raise ValueError("prefix must be comprised of 3 or 4 capital letters")
            return prefix
    
        def __repr__(self):
            return f'<Transaction {self.id}>'
    
        def to_dict(self):
            data = {
                'id': self.id,
                'submitted': self.timestamp.isoformat() + 'Z',
                'price': self.price,
                '_links': {
                    'self': url_for('api.get_transaction', _external=True, id=self.id),
                    'customer': url_for('api.get_customer', _external=True, id=self.customer_id),
                    'documents': [url_for('api.get_document', _external=True,
                                          document_id=document.document_id, transaction_id=document.transaction_id)
                                  for document in self.documents]
                }
            }
            return data
    
    opened by USussman 0
  • Make BaseView compatible with Flask 2.2.x

    Make BaseView compatible with Flask 2.2.x

    The as_view method in the latest Flask version doesn't receive any positional argument, since this change: https://github.com/pallets/flask/commit/6e23239567efde1c2e272db87c53444d6c22a1bb

    This patch makes the code in base compatible with this new version, trying to call the view with the positional argument if present and in other case it's passed as cls named argument.

    This fixes the test_nested_flask_views that was broken for this version.

    opened by danigm 0
  • fix: example code for sqla-custom-inline-forms

    fix: example code for sqla-custom-inline-forms

    Update example code for sqla-custom-inline-forms.

    • Fix import error due to WTForms version outdated
    • Fix out of flask app context error for db.create_all()
    opened by Titotix 0
  • Pull request for google app engine cloud ndb

    Pull request for google app engine cloud ndb

    Hello, I'd love to use flask-admin with google's cloud ndb on app engine. There is an existing pull request for this here: https://github.com/flask-admin/flask-admin/pull/2067

    I'd like to submit an improved version of this pull request:

    • Leave the existing, older appengine code as it is since people might be using it.
    • Add a new section (flask_admin/contrib/cloud_ndb) for the latest cloud ndb used with appengine.
    • Skip the fileadmin part of the existing pull request since I don't need it and to lighten the pull request.

    Would this be a welcome pull request?

    Please let me know how to make this as easy as possible for you.

    opened by pb-jeff-oneill 0
  • Cant download

    Cant download

    DownloadLinkFetchFailed(errorTrace=Find Link for Head & Heart (feat. MNEK) - Tiësto Remix

    Fetching From Saavn Failed:DownloadLinkFetchFailed(errorTrace=No SAAVN Match Found for Head & Heart (feat. MNEK) - Tiësto Remix) at com.shabinder.common.providers.saavn.requests.JioSaavnRequests$DefaultImpls.findBestSongDownloadURL(JioSaavnRequests.kt:299) at com.shabinder.common.providers.saavn.requests.JioSaavnRequests$findBestSongDownloadURL$1.invokeSuspend(Unknown Source:10) at h7.a.resumeWith(ContinuationImpl.kt:10) at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:55) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:17) at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.kt:0) at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:24) at h7.a.resumeWith(ContinuationImpl.kt:33) at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:55) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:17) at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.kt:0) at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:24) at h7.a.resumeWith(ContinuationImpl.kt:33) at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:55) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:17) at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.kt:0) at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:24) at h7.a.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:12) at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:2) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:0) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:14) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:28) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:0)

    Fetching From YT Failed:NoMatchFound(trackName=Head & Heart (feat. MNEK) - Tiësto Remix, message=Head & Heart (feat. MNEK) - Tiësto Remix : No match found!) at com.shabinder.common.providers.youtube_music.YoutubeMusic.getYTIDBestMatch(YoutubeMusic.kt:179) at com.shabinder.common.providers.youtube_music.YoutubeMusic.access$getYTIDBestMatch(YoutubeMusic.kt:0) at com.shabinder.common.providers.youtube_music.YoutubeMusic$getYTIDBestMatch$1.invokeSuspend(Unknown Source:12) at h7.a.resumeWith(ContinuationImpl.kt:10) at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:55) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:17) at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.kt:0) at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:24) at h7.a.resumeWith(ContinuationImpl.kt:33) at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:55) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:17) at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.kt:0) at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:24) at h7.a.resumeWith(ContinuationImpl.kt:33) at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:55) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:17) at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.kt:0) at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:24) at h7.a.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:12) at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:2) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:0) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:14) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:28) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:0)

    ) at com.shabinder.common.providers.FetchPlatformQueryResult.findBestDownloadLink(FetchPlatformQueryResult.kt:1873) at com.shabinder.common.providers.FetchPlatformQueryResult$findBestDownloadLink$1.invokeSuspend(Unknown Source:12) at h7.a.resumeWith(ContinuationImpl.kt:10) at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:55) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:17) at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.kt:0) at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:24) at h7.a.resumeWith(ContinuationImpl.kt:33) at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:55) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:17) at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.kt:0) at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:24) at h7.a.resumeWith(ContinuationImpl.kt:33) at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:55) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:17) at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.kt:0) at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:24) at h7.a.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:12) at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:2) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:0) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:14) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:28) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:0)

    opened by nahidThe10 0
  • "Save and Continue Editing" doesn't retain the backlink on edit page

    opened by LeXofLeviafan 0
Releases(v1.6.0)
  • v1.6.0(Jan 30, 2022)

  • v1.5.8(Apr 17, 2021)

  • v1.5.7(Oct 26, 2020)

  • v1.5.6(Apr 9, 2020)

  • v1.5.5(Feb 7, 2020)

  • 1.5.4(Oct 16, 2019)

    • Fix display of inline x-editable boolean fields on list view
    • Add support for several SQLAlchemy-Utils data types
    • Support searching on SQLAlchemy hybrid properties
    • Extra URL paramaters are now propagated to the next page when searching / filtering
    • Add enum34 dependency when running on legacy Python version
    • Update Mapbox API v1 URL format
    • Update jQuery and moment dependencies in templates
    • Fixed a datepicker issue, where only dates up to 2015 were showing up
    • Updated Pillow dependency version
    Source code(tar.gz)
    Source code(zip)
  • v1.5.3(Dec 20, 2018)

    • Fixed XSS vulnerability
    • Support nested categories in the navbar menu
    • SQLAlchemy
      • sort on multiple columns with column_default_sort
      • sort on related models in column_sortable_list
      • fix: inline model forms can now also be used for models with multiple primary keys
      • support for using mapped column_property
    • Upgrade Leaflet and Leaflet.draw plugins, used for geoalchemy integration
    • Specify minimum_input_length for ajax widget
    • Peewee: support composite keys
    • MongoEngine: when searching/filtering the input is now regarded as case-insensitive by default
    • FileAdmin
      • handle special characters in filename
      • fix a bug with listing directories on Windows
      • avoid raising an exception when unknown sort parameter is encountered
    • WTForms 3 support
    Source code(tar.gz)
    Source code(zip)
  • v1.5.2(Aug 27, 2018)

    1.5.2

    • Fixed XSS vulnerability
    • Fixed Peewee support
    • Added detail view column formatters
    • Updated Flask-Login example to work with the newer version of the library
    • Various SQLAlchemy-related fixes
    • Various Windows related fixes for the file admin
    Source code(tar.gz)
    Source code(zip)
  • v1.5.0(Mar 12, 2017)

    • Fixed CSRF generation logic for multi-process deployments
    • Added WTForms >= 3.0 support
    • Flask-Admin would not recursively save inline models, allowing arbitrary nesting
    • Added configuration properties that allow injection of additional CSS and JS dependencies into templates without overriding them
    • SQLAlchemy backend
      • Updated hybrid property detection using new SQLAlchemy APIs
      • Added support for association proxies
      • Added support for remote hybrid properties filters
      • Added support for ARRAY column type
    • Localization-related fixes
    • MongoEngine backend is now properly formats model labels
    • Improved Google App Engine support:
      • Added TextProperty, KeyProperty and SelectField support
      • Added support for form_args, excluded_columns, page_size and after_model_update
    • Fixed URL generation with localized named filters
    • FileAdmin has Bootstrap 2 support now
    • Geoalchemy support fixes
      • Use Google Places (by default) for place search
    • Updated translations
    • Bug fixes
    Source code(tar.gz)
    Source code(zip)
  • v1.4.2(Jun 14, 2016)

  • v1.4.1(Jun 13, 2016)

    1.4.1

    • Official Python 3.5 support
    • Customizable row actions
    • Tablib support (exporting to XLS, XLSX, CSV, etc)
    • Updated external dependencies (jQuery, x-editable, etc)
    • Added settings that allows exceptions to be raised on view errors
    • Bug fixes
    Source code(tar.gz)
    Source code(zip)
  • v1.4.0(Jan 2, 2016)

    • Updated and reworked documentation
    • FileAdmin went through minor refactoring and now supports remote file systems. Comes with the new, optional, AWS S3 file management interface
    • Configurable CSV export for model views
    • Added overridable URL generation logic. Allows using custom URLs with parameters for administrative views
    • Added column_display_actions to ModelView control visibility of the action column without overriding the template
    • Added support for the latest MongoEngine
    • Added support for HSTORE columns to SQLA backend
    • New SecureForm base class for easier CSRF validation
    • Lots of translation-related fixes and updated translations
    • Bug fixes
    Source code(tar.gz)
    Source code(zip)
  • v1.3.0(Aug 23, 2015)

    • New feature: Edit models in the list view in a popup
    • New feature: Read-only model details view
    • Fixed XSS in column_editable_list values
    • Improved navigation consistency in model create and edit views
    • Ability to choose page size in model list view
    • Updated client-side dependencies (jQuery, Select2, etc)
    • Updated documentation and examples
    • Updated translations
    • Bug fixes
    Source code(tar.gz)
    Source code(zip)
  • v1.2.0(Jun 13, 2015)

    • Codebase was migrated to Flask-Admin GitHub organization
    • Automatically inject Flask-WTF CSRF token to internal Flask-Admin forms
    • MapBox v4 support for GeoAlchemy
    • Updated translations with help of CrowdIn
    • Show warning if field was ignored in form rendering rules
    • Simple AppEngine backend
    • Optional support for Font Awesome in templates and menus
    • Bug fixes
    Source code(tar.gz)
    Source code(zip)
  • v1.1.0(Mar 2, 2015)

    Mostly bug fix release. Highlights:

    • Inline model editing on the list page
    • FileAdmin refactoring and fixes
    • FileUploadField and ImageUploadField will work with Required() validator
    • Bug fixes
    Source code(tar.gz)
    Source code(zip)
Owner
Flask-Admin
Flask-Admin and related projects
Flask-Admin
Extends the Django Admin to include a extensible dashboard and navigation menu

django-admin-tools django-admin-tools is a collection of extensions/tools for the default django administration interface, it includes: a full feature

Django Admin Tools 731 Dec 28, 2022
Drop-in replacement of Django admin comes with lots of goodies, fully extensible with plugin support, pretty UI based on Twitter Bootstrap.

Xadmin Drop-in replacement of Django admin comes with lots of goodies, fully extensible with plugin support, pretty UI based on Twitter Bootstrap. Liv

差沙 4.7k Dec 31, 2022
Jinja is a fast, expressive, extensible templating engine.

Jinja is a fast, expressive, extensible templating engine. Special placeholders in the template allow writing code similar to Python syntax.

The Pallets Projects 9k Jan 4, 2023
Drop-in replacement of Django admin comes with lots of goodies, fully extensible with plugin support, pretty UI based on Twitter Bootstrap.

Xadmin Drop-in replacement of Django admin comes with lots of goodies, fully extensible with plugin support, pretty UI based on Twitter Bootstrap. Liv

差沙 4.7k Dec 31, 2022
Django Smuggler is a pluggable application for Django Web Framework that helps you to import/export fixtures via the automatically-generated administration interface.

Django Smuggler Django Smuggler is a pluggable application for Django Web Framework to easily dump/load fixtures via the automatically-generated admin

semente 373 Dec 26, 2022
A flat theme for Django admin interface. Modern, fresh, simple.

Django Flat Theme django-flat-theme is included as part of Django from version 1.9! ?? Please use this app if your project is powered by an older Djan

elky 416 Sep 22, 2022
WebVirtCloud is virtualization web interface for admins and users

WebVirtCloud is a virtualization web interface for admins and users. It can delegate Virtual Machine's to users. A noVNC viewer presents a full graphical console to the guest domain. KVM is currently the only hypervisor supported.

Anatoliy Guskov 1.3k Dec 29, 2022
Modern responsive template for the Django admin interface with improved functionality. We are proud to announce completely new Jet. Please check out Live Demo

Django JET Modern template for Django admin interface with improved functionality Attention! NEW JET We are proud to announce completely new Jet. Plea

Geex Arts 3.4k Dec 29, 2022
A jazzy skin for the Django Admin-Interface (official repository).

Django Grappelli A jazzy skin for the Django admin interface. Grappelli is a grid-based alternative/extension to the Django administration interface.

Patrick Kranzlmueller 3.4k Dec 31, 2022
django's default admin interface made customizable. popup windows replaced by modals. :mage: :zap:

django-admin-interface django-admin-interface is a modern responsive flat admin interface customizable by the admin itself. Features Beautiful default

Fabio Caccamo 1.3k Dec 31, 2022
Modern theme for Django admin interface

Django Suit Modern theme for Django admin interface. Django Suit is alternative theme/skin/extension for Django administration interface. Project home

Kaspars Sprogis 2.2k Dec 29, 2022
📱 An extension for Django admin that makes interface mobile-friendly. Merged into Django 2.0

Django Flat Responsive django-flat-responsive is included as part of Django from version 2.0! ?? Use this app if your project is powered by an older D

elky 248 Sep 2, 2022
A jazzy skin for the Django Admin-Interface (official repository).

Django Grappelli A jazzy skin for the Django admin interface. Grappelli is a grid-based alternative/extension to the Django administration interface.

Patrick Kranzlmueller 3.4k Dec 31, 2022
Modern theme for Django admin interface

Django Suit Modern theme for Django admin interface. Django Suit is alternative theme/skin/extension for Django administration interface. Project home

Kaspars Sprogis 2.2k Dec 29, 2022
aiohttp admin is generator for admin interface based on aiohttp

aiohttp admin is generator for admin interface based on aiohttp

Mykhailo Havelia 17 Nov 16, 2022
Disable dark mode in Django admin user interface in Django 3.2.x.

Django Non Dark Admin Disable or enable dark mode user interface in Django admin panel (Django==3.2). Installation For install this app run in termina

Artem Galichkin 6 Nov 23, 2022
Firebase Admin Console is a centralized platform for easy viewing and maintenance of Firestore database, the back-end API is a Python Flask app.

Firebase Admin Console is a centralized platform for easy viewing and maintenance of Firestore database, the back-end API is a Python Flask app. A starting template for developers to customize, build, and even deploy the desired admin console for their DB.

Daqi Chen 1 Sep 10, 2022
PyMMO is a Python-based MMO game framework using sockets and PyGame.

PyMMO is a Python framework/template of a MMO game built using PyGame on top of Python's built-in socket module.

Luis Souto Maior 61 Dec 18, 2022
Jet Bridge (Universal) for Jet Admin – API-based Admin Panel Framework for your application

Jet Bridge for Jet Admin – Admin panel framework for your application Description About Jet Admin: https://about.jetadmin.io Live Demo: https://app.je

Jet Admin 1.3k Dec 27, 2022