Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
flask-admin
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Python-Dev
flask-admin
Commits
b4a24be4
Commit
b4a24be4
authored
Oct 17, 2018
by
PJ Janse van Rensburg
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Drop 'layout' example in favour of bs3 version.
parent
5efa146a
Changes
11
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
1 addition
and
340 deletions
+1
-340
README.rst
examples/layout/README.rst
+0
-27
__init__.py
examples/layout/__init__.py
+0
-0
app.py
examples/layout/app.py
+0
-149
requirements.txt
examples/layout/requirements.txt
+0
-3
layout.css
examples/layout/static/layout.css
+0
-50
index.html
examples/layout/templates/admin/index.html
+0
-17
create.html
examples/layout/templates/create.html
+0
-16
edit.html
examples/layout/templates/edit.html
+0
-16
layout.html
examples/layout/templates/layout.html
+0
-30
list.html
examples/layout/templates/list.html
+0
-31
layout.html
examples/layout_bootstrap3/templates/layout.html
+1
-1
No files found.
examples/layout/README.rst
deleted
100644 → 0
View file @
5efa146a
This example shows how you can customize the look & feel of the admin interface. This is done by overriding some of the built-in templates.
To run this example:
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
source env/bin/activate
3. Install requirements::
pip install -r 'examples/layout/requirements.txt'
4. Run the application::
python examples/layout/app.py
The first time you run this example, a sample sqlite database gets populated automatically. To suppress this behaviour,
comment the following lines in app.py:::
if not os.path.exists(database_path):
build_sample_db()
examples/layout/__init__.py
deleted
100644 → 0
View file @
5efa146a
examples/layout/app.py
deleted
100644 → 0
View file @
5efa146a
import
os
import
os.path
as
op
from
flask
import
Flask
from
flask_sqlalchemy
import
SQLAlchemy
import
flask_admin
as
admin
from
flask_admin.contrib.sqla
import
ModelView
# 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
[
'DATABASE_FILE'
]
=
'sample_db.sqlite'
app
.
config
[
'SQLALCHEMY_DATABASE_URI'
]
=
'sqlite:///'
+
app
.
config
[
'DATABASE_FILE'
]
app
.
config
[
'SQLALCHEMY_ECHO'
]
=
True
db
=
SQLAlchemy
(
app
)
# Models
class
User
(
db
.
Model
):
id
=
db
.
Column
(
db
.
Integer
,
primary_key
=
True
)
name
=
db
.
Column
(
db
.
Unicode
(
64
))
email
=
db
.
Column
(
db
.
Unicode
(
64
))
def
__unicode__
(
self
):
return
self
.
name
class
Page
(
db
.
Model
):
id
=
db
.
Column
(
db
.
Integer
,
primary_key
=
True
)
title
=
db
.
Column
(
db
.
Unicode
(
64
))
content
=
db
.
Column
(
db
.
UnicodeText
)
def
__unicode__
(
self
):
return
self
.
name
# Customized admin interface
class
CustomView
(
ModelView
):
list_template
=
'list.html'
create_template
=
'create.html'
edit_template
=
'edit.html'
class
UserAdmin
(
CustomView
):
column_searchable_list
=
(
'name'
,)
column_filters
=
(
'name'
,
'email'
)
# Flask views
@
app
.
route
(
'/'
)
def
index
():
return
'<a href="/admin/">Click me to get to Admin!</a>'
# Create admin with custom base template
admin
=
admin
.
Admin
(
app
,
'Example: Layout'
,
base_template
=
'layout.html'
,
template_mode
=
'bootstrap3'
)
# Add views
admin
.
add_view
(
UserAdmin
(
User
,
db
.
session
))
admin
.
add_view
(
CustomView
(
Page
,
db
.
session
))
def
build_sample_db
():
"""
Populate a small db with some example entries.
"""
db
.
drop_all
()
db
.
create_all
()
first_names
=
[
'Harry'
,
'Amelia'
,
'Oliver'
,
'Jack'
,
'Isabella'
,
'Charlie'
,
'Sophie'
,
'Mia'
,
'Jacob'
,
'Thomas'
,
'Emily'
,
'Lily'
,
'Ava'
,
'Isla'
,
'Alfie'
,
'Olivia'
,
'Jessica'
,
'Riley'
,
'William'
,
'James'
,
'Geoffrey'
,
'Lisa'
,
'Benjamin'
,
'Stacey'
,
'Lucy'
]
last_names
=
[
'Brown'
,
'Smith'
,
'Patel'
,
'Jones'
,
'Williams'
,
'Johnson'
,
'Taylor'
,
'Thomas'
,
'Roberts'
,
'Khan'
,
'Lewis'
,
'Jackson'
,
'Clarke'
,
'James'
,
'Phillips'
,
'Wilson'
,
'Ali'
,
'Mason'
,
'Mitchell'
,
'Rose'
,
'Davis'
,
'Davies'
,
'Rodriguez'
,
'Cox'
,
'Alexander'
]
for
i
in
range
(
len
(
first_names
)):
user
=
User
()
user
.
name
=
first_names
[
i
]
+
" "
+
last_names
[
i
]
user
.
email
=
first_names
[
i
]
.
lower
()
+
"@example.com"
db
.
session
.
add
(
user
)
sample_text
=
[
{
'title'
:
"de Finibus Bonorum et Malorum - Part I"
,
'content'
:
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
\
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
\
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
\
dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
\
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
\
mollit anim id est laborum."
},
{
'title'
:
"de Finibus Bonorum et Malorum - Part II"
,
'content'
:
"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque
\
laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto
\
beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur
\
aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi
\
nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur,
\
adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam
\
aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam
\
corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum
\
iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum
\
qui dolorem eum fugiat quo voluptas nulla pariatur?"
},
{
'title'
:
"de Finibus Bonorum et Malorum - Part III"
,
'content'
:
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium
\
voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati
\
cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id
\
est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam
\
libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod
\
maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus.
\
Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet
\
ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur
\
a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis
\
doloribus asperiores repellat."
}
]
for
entry
in
sample_text
:
page
=
Page
()
page
.
title
=
entry
[
'title'
]
page
.
content
=
entry
[
'content'
]
db
.
session
.
add
(
page
)
db
.
session
.
commit
()
return
if
__name__
==
'__main__'
:
# Build a sample db on the fly, if one does not exist yet.
app_dir
=
op
.
realpath
(
os
.
path
.
dirname
(
__file__
))
database_path
=
op
.
join
(
app_dir
,
app
.
config
[
'DATABASE_FILE'
])
if
not
os
.
path
.
exists
(
database_path
):
build_sample_db
()
# Start app
app
.
run
(
debug
=
True
)
examples/layout/requirements.txt
deleted
100644 → 0
View file @
5efa146a
Flask
Flask-Admin
Flask-SQLAlchemy
examples/layout/static/layout.css
deleted
100644 → 0
View file @
5efa146a
body
{
background
:
#EEE
;
}
#content
{
background
:
white
;
border
:
1px
solid
#CCC
;
padding
:
12px
;
overflow
:
scroll
;
}
#brand
{
float
:
left
;
font-weight
:
300
;
margin
:
0
;
}
.search-form
{
margin
:
0
5px
;
}
.search-form
form
{
margin
:
0
;
}
.btn-menu
{
margin
:
4px
5px
0
0
;
float
:
right
;
}
.btn-menu
a
,
.btn-menu
input
{
padding
:
7px
16px
!important
;
border-radius
:
0
!important
;
}
.btn
,
textarea
,
input
[
type
],
button
,
.model-list
{
border-radius
:
0
;
}
.model-list
{
border-radius
:
0
;
}
.nav-pills
li
>
a
{
border-radius
:
0
;
}
.select2-container
.select2-choice
{
border-radius
:
0
;
}
\ No newline at end of file
examples/layout/templates/admin/index.html
deleted
100644 → 0
View file @
5efa146a
{% extends 'admin/master.html' %}
{% block body %}
{{ super() }}
<div
class=
"row-fluid"
>
<h1>
Flask-Admin example
</h1>
<p
class=
"lead"
>
Customize the layout
</p>
<p>
This example shows how you can customize the look
&
feel of the admin interface.
</p>
<p>
This is done by overriding some of the built-in templates.
</p>
<a
class=
"btn btn-primary"
href=
"/"
><i
class=
"glyphicon glyphicon-arrow-left"
></i>
Back
</a>
</div>
{% endblock body %}
examples/layout/templates/create.html
deleted
100644 → 0
View file @
5efa146a
{% extends 'admin/model/create.html' %}
{% block brand %}
<h2
id=
"brand"
>
Create {{ admin_view.name|capitalize }}
</h2>
<div
class=
"clearfix"
></div>
<hr>
{% endblock %}
{% block body %}
{% call lib.form_tag(form) %}
{{ lib.render_form_fields(form, form_opts=form_opts) }}
<div
class=
"form-buttons"
>
{{ lib.render_form_buttons(return_url, extra()) }}
</div>
{% endcall %}
{% endblock %}
examples/layout/templates/edit.html
deleted
100644 → 0
View file @
5efa146a
{% extends 'admin/model/edit.html' %}
{% block brand %}
<h2
id=
"brand"
>
Edit {{ admin_view.name|capitalize }}
</h2>
<div
class=
"clearfix"
></div>
<hr>
{% endblock %}
{% block body %}
{% call lib.form_tag(form) %}
{{ lib.render_form_fields(form, form_opts=form_opts) }}
<div
class=
"form-buttons"
>
{{ lib.render_form_buttons(return_url) }}
</div>
{% endcall %}
{% endblock %}
examples/layout/templates/layout.html
deleted
100644 → 0
View file @
5efa146a
{% import 'admin/layout.html' as layout with context -%}
{% extends 'admin/base.html' %}
{% block head_tail %}
{{ super() }}
<link
href=
"{{ url_for('static', filename='layout.css') }}"
rel=
"stylesheet"
>
{% endblock %}
{% block page_body %}
<div
class=
"container-fluid"
>
<div
class=
"row"
>
<div
class=
"col-sm-3"
>
<ul
class=
"nav nav-pills nav-stacked"
>
{{ layout.menu() }}
{{ layout.menu_links() }}
</ul>
</div>
<div
class=
"col-sm-9"
>
<div
id=
"content"
>
{% block brand %}
<h2
id=
"brand"
>
{{ admin_view.name|capitalize }}
</h2>
<div
class=
"clearfix"
></div>
{% endblock %}
{{ layout.messages() }}
{% block body %}{% endblock %}
</div>
</div>
</div>
</div>
{% endblock %}
examples/layout/templates/list.html
deleted
100644 → 0
View file @
5efa146a
{% extends 'admin/model/list.html' %}
{% import 'admin/model/layout.html' as model_layout with context %}
{% block model_menu_bar %}
<h2
id=
"brand"
>
{{ admin_view.name|capitalize }} list
</h2>
{% if admin_view.can_create %}
<div
class=
"btn-menu"
>
<a
href=
"{{ url_for('.create_view', url=return_url) }}"
class=
"btn btn-primary pull-right"
>
{{ _gettext('Create') }}
</a>
</div>
{% endif %}
{% if filter_groups %}
<div
class=
"btn-group btn-menu"
>
{{ model_layout.filter_options(btn_class='btn dropdown-toggle btn-title') }}
</div>
{% endif %}
{% if actions %}
<div
class=
"btn-group btn-menu"
>
{{ actionlib.dropdown(actions, btn_class='btn dropdown-toggle btn-title') }}
</div>
{% endif %}
{% if search_supported %}
<div
class=
"search-form btn-menu"
>
{{ model_layout.search_form(input_class='span2 btn-title') }}
</div>
{% endif %}
<div
class=
"clearfix"
></div>
<hr>
{% endblock %}
examples/layout_bootstrap3/templates/layout.html
View file @
b4a24be4
...
...
@@ -7,7 +7,7 @@
{% endblock %}
{% block page_body %}
<div
class=
"container"
>
<div
class=
"container
-fluid
"
>
<div
class=
"row"
>
<div
class=
"col-md-2"
role=
"navigation"
>
<ul
class=
"nav nav-pills nav-stacked"
>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment