Skip to content

Instantly share code, notes, and snippets.

@pawl
Last active March 19, 2019 04:24
Show Gist options
  • Save pawl/f6c0270d83241c31237a to your computer and use it in GitHub Desktop.
Save pawl/f6c0270d83241c31237a to your computer and use it in GitHub Desktop.
Example of an user selected page_size in flask-admin
from flask import Flask, session, request
from flask_sqlalchemy import SQLAlchemy
import flask_admin as admin
from flask_admin.contrib import sqla
from flask_admin import expose
# Create application
app = Flask(__name__)
# Create dummy secrey key so we can use sessions
app.config['SECRET_KEY'] = '123456790'
# Create in-memory database
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///sample_db_3.sqlite'
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)
# Flask views
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
session['pagesize'] = int(request.form['pagesize'])
return '''
<a href="/admin/">Click me to get to Admin!</a>
<form action="" method="post">
<p><input type=text name=pagesize>
<p><input type=submit value=submit>
</form>
'''
class Car(db.Model):
__tablename__ = 'cars'
id = db.Column(db.Integer(), primary_key=True)
desc = db.Column(db.String())
def __unicode__(self):
return self.desc
class CarAdmin(sqla.ModelView):
column_display_pk = True
@expose('/')
def index_view(self):
"""
List view
"""
if self.column_editable_list:
form = self.list_form()
else:
form = None
if self.can_delete:
delete_form = self.delete_form()
else:
delete_form = None
# Grab parameters from URL
view_args = self._get_list_extra_args()
# Map column index to column name
sort_column = self._get_column_by_idx(view_args.sort)
if sort_column is not None:
sort_column = sort_column[0]
# Get count and data
count, data = self.get_list(view_args.page, sort_column, view_args.sort_desc,
view_args.search, view_args.filters,
page_size=session.get('pagesize', 20))
# Calculate number of pages
if count is not None:
num_pages = count // session.get('pagesize', 20)
if count % session.get('pagesize', 20) != 0:
num_pages += 1
else:
num_pages = None
# Various URL generation helpers
def pager_url(p):
# Do not add page number if it is first page
if p == 0:
p = None
return self._get_list_url(view_args.clone(page=p))
def sort_url(column, invert=False):
desc = None
if invert and not view_args.sort_desc:
desc = 1
return self._get_list_url(view_args.clone(sort=column, sort_desc=desc))
# Actions
actions, actions_confirmation = self.get_actions_list()
clear_search_url = self._get_list_url(view_args.clone(page=0,
sort=view_args.sort,
sort_desc=view_args.sort_desc,
search=None,
filters=None))
return self.render(
self.list_template,
data=data,
form=form,
delete_form=delete_form,
# List
list_columns=self._list_columns,
sortable_columns=self._sortable_columns,
editable_columns=self.column_editable_list,
# Pagination
count=count,
pager_url=pager_url,
num_pages=num_pages,
page=view_args.page,
page_size=self.page_size,
# Sorting
sort_column=view_args.sort,
sort_desc=view_args.sort_desc,
sort_url=sort_url,
# Search
search_supported=self._search_supported,
clear_search_url=clear_search_url,
search=view_args.search,
# Filters
filters=self._filters,
filter_groups=self._get_filter_groups(),
active_filters=view_args.filters,
# Actions
actions=actions,
actions_confirmation=actions_confirmation,
# Misc
enumerate=enumerate,
get_pk_value=self.get_pk_value,
get_value=self.get_list_value,
return_url=self._get_list_url(view_args),
)
# Create admin
admin = admin.Admin(app, name='Example: SQLAlchemy2', template_mode='bootstrap3')
admin.add_view(CarAdmin(Car, db.session))
if __name__ == '__main__':
# Create DB
db.drop_all()
db.create_all()
for x in xrange(1, 51):
db.session.add(Car(desc='car1'))
db.session.commit()
# Start app
app.run(debug=True)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment