Skip to content

Commit b7d1e0b

Browse files
committed
Example app: Add strings demo
1 parent 22c9adb commit b7d1e0b

File tree

5 files changed

+102
-0
lines changed

5 files changed

+102
-0
lines changed

example_app/app.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from example_app import views
66
from example_app.models import db
7+
from example_app.strings_demo import strings_demo_view
78
from flask_mongoengine.panels import mongo_command_logger
89

910
app = flask.Flask("example_app")
@@ -40,6 +41,10 @@
4041

4142
app.add_url_rule("/", view_func=views.index, methods=["GET", "POST"])
4243
app.add_url_rule("/pagination", view_func=views.pagination, methods=["GET", "POST"])
44+
app.add_url_rule("/strings_demo", view_func=strings_demo_view, methods=["GET", "POST"])
45+
app.add_url_rule(
46+
"/strings_demo/<pk>/", view_func=strings_demo_view, methods=["GET", "POST"]
47+
)
4348

4449
if __name__ == "__main__":
4550
app.run(host="0.0.0.0", port=8000)

example_app/strings_demo.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
"""Strings and strings related fields demo model."""
2+
import re
3+
4+
from flask import render_template, request
5+
6+
from example_app.models import db
7+
from flask_mongoengine.wtf import fields as mongo_fields
8+
9+
10+
class StringsDemoModel(db.Document):
11+
"""Documentation example model."""
12+
13+
string_field = db.StringField()
14+
regexp_string_field = db.StringField(
15+
regex=re.compile(
16+
r"^(https:\/\/)[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=]+$"
17+
)
18+
)
19+
sized_string_field = db.StringField(min_length=5)
20+
tel_field = db.StringField(wtf_field_class=mongo_fields.MongoTelField)
21+
password_field = db.StringField(
22+
wtf_field_class=mongo_fields.MongoPasswordField,
23+
required=True,
24+
min_length=5,
25+
)
26+
email_field = db.EmailField()
27+
url_field = db.URLField()
28+
29+
30+
StringsDemoForm = StringsDemoModel.to_wtf_form()
31+
32+
33+
def strings_demo_view(pk=None):
34+
"""Return all fields demonstration."""
35+
form = StringsDemoForm()
36+
obj = None
37+
if pk:
38+
obj = StringsDemoModel.objects.get(pk=pk)
39+
form = StringsDemoForm(obj=obj)
40+
41+
if request.method == "POST" and form.validate_on_submit():
42+
if pk:
43+
form.populate_obj(obj)
44+
obj.save()
45+
else:
46+
form.save()
47+
page_num = int(request.args.get("page") or 1)
48+
page = StringsDemoModel.objects.paginate(page=page_num, per_page=100)
49+
50+
return render_template(
51+
"strings_demo.html", page=page, form=form, model=StringsDemoModel
52+
)

example_app/templates/layout.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
body {
99
grid-template-columns: auto;
1010
}
11+
1112
textarea:not([cols]) {
1213
width: auto;
1314
}
@@ -17,6 +18,7 @@
1718
<ul>
1819
<li><a href="{{ url_for("index") }}">Home</a></li>
1920
<li><a href="{{ url_for("pagination") }}">Pagination</a></li>
21+
<li><a href="{{ url_for("strings_demo_view") }}">Strings demo</a></li>
2022
</ul>
2123
</nav>
2224
<div>
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{% extends "layout.html" %}
2+
{% from "_formhelpers.html" import render_field %}
3+
{% from "_formhelpers.html" import render_navigation %}
4+
5+
{% block body %}
6+
7+
<div>
8+
<table>
9+
<thead>
10+
<tr>
11+
{% for field in model._fields_ordered %}
12+
<th>{{ model[field].name }}</th>
13+
{% endfor %}
14+
<th>Edit</th>
15+
</tr>
16+
</thead>
17+
<tbody>
18+
{% for page_object in page.items %}
19+
<tr>
20+
{% for field in page_object._fields_ordered %}
21+
<td>{{ page_object[field] }}</td>
22+
{% endfor %}
23+
<td><a href="{{ url_for('strings_demo_view', pk=page_object.pk) }}">edit</a></td>
24+
</tr>
25+
{% endfor %}
26+
</tbody>
27+
</table>
28+
</div>
29+
<div>
30+
{{ render_navigation(page, "strings_demo_view") }}
31+
</div>
32+
<div>
33+
<form method="POST">
34+
{% for field in form %}
35+
{{ render_field(field, style='font-weight: bold') }}
36+
{% endfor %}
37+
<input type="submit" value="{% if form.instance %}Edit{% else %}Create{% endif %}">
38+
</form>
39+
</div>
40+
41+
{% endblock %}

example_app/views.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from mongoengine.context_managers import switch_db
55

66
from example_app import models
7+
from example_app.strings_demo import StringsDemoModel
78

89

910
def generate_data():
@@ -47,6 +48,7 @@ def delete_data():
4748
"""Clear database."""
4849
with switch_db(models.Todo, "default"):
4950
models.Todo.objects().delete()
51+
StringsDemoModel.objects().delete()
5052
with switch_db(models.Todo, "secondary"):
5153
models.Todo.objects().delete()
5254

0 commit comments

Comments
 (0)