diff --git a/README.md b/README.md index 1a5eaea..8a727e1 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,13 @@ Everytime a section needs to be rendered, SimpleCMS will call the appropriate section view and insert the rendered result into the final rendered page. +But that's not all! SimpleCMS is easily extendable. You can add custom +fields to your Page and Section models. You can even add one-to-many +fields by defining new models with a foreign key to the Section model, +and the Edit interface will automagically show the user nested +formsets to edit the related instances! For a complete example see the +included `example` app. + ## The "Edit" Interface Somewhat like the Django Admin site, SimpleCMS comes with its own diff --git a/cms/middleware.py b/cms/middleware.py index 09a6881..1b73a03 100644 --- a/cms/middleware.py +++ b/cms/middleware.py @@ -3,7 +3,8 @@ from sass import compile from django.conf import settings def locate(filename): - for path, dirs, files in os.walk(os.getcwd()): + for path, dirs, files in os.walk(os.getcwd(), followlinks=True): + print(dirs) for f in files: if f == filename: return os.path.join(path, filename) diff --git a/cms/static/cms/admin.scss b/cms/static/cms/admin.scss index d825d2f..46d119d 100644 --- a/cms/static/cms/admin.scss +++ b/cms/static/cms/admin.scss @@ -46,7 +46,8 @@ form.cms { background: $background; border: 0.5px solid #ccc; clear: both; - margin: 0.25em 0em; + margin: 0.5em 0; + margin-top: 0.25em; padding: 0.25em 0.5em; padding-top: 0; border-radius: 0.25em; @@ -60,8 +61,7 @@ form.cms { } div.formfield { - margin-top: 0.25em; - margin-bottom: 0.25em; + margin: 0.25em 0; overflow: hidden; clear: both; box-sizing: border-box; @@ -131,8 +131,6 @@ form.cms { vertical-align: middle; } textarea { - font-size: 1rem; - height: 15em; line-height: 1.5; overflow-y: hidden; } diff --git a/cms/static/cms/admin.scss.css b/cms/static/cms/admin.scss.css index bdc082b..10d3f91 100644 --- a/cms/static/cms/admin.scss.css +++ b/cms/static/cms/admin.scss.css @@ -34,7 +34,8 @@ form.cms { background: #fff6; border: 0.5px solid #ccc; clear: both; - margin: 0.25em 0em; + margin: 0.5em 0; + margin-top: 0.25em; padding: 0.25em 0.5em; padding-top: 0; border-radius: 0.25em; } @@ -44,8 +45,7 @@ form.cms { width: 50px; cursor: pointer; } form.cms div.formfield { - margin-top: 0.25em; - margin-bottom: 0.25em; + margin: 0.25em 0; overflow: hidden; clear: both; box-sizing: border-box; } @@ -97,8 +97,6 @@ form.cms { display: inline-block; vertical-align: middle; } form.cms textarea { - font-size: 1rem; - height: 15em; line-height: 1.5; overflow-y: hidden; } form.cms select { diff --git a/cms/static/cms/admin.scss.css.map b/cms/static/cms/admin.scss.css.map index ad6f0f1..16eb52b 100644 --- a/cms/static/cms/admin.scss.css.map +++ b/cms/static/cms/admin.scss.css.map @@ -5,5 +5,5 @@ "admin.scss" ], "names": [], - "mappings": "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" + "mappings": "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" } \ No newline at end of file diff --git a/cms/templates/cms/admin.html b/cms/templates/cms/admin.html index 9ded59f..10ee822 100644 --- a/cms/templates/cms/admin.html +++ b/cms/templates/cms/admin.html @@ -7,7 +7,6 @@ {% block title %}{% endblock %} - {% block extrahead %}{% endblock %} diff --git a/cms/templates/cms/edit.html b/cms/templates/cms/edit.html index f56afc0..632b8e2 100644 --- a/cms/templates/cms/edit.html +++ b/cms/templates/cms/edit.html @@ -98,7 +98,6 @@ function setEventHandlers() { for (let typefield of document.querySelectorAll('select[name$=-type]')) { let formId = typefield.name.replace(/-type$/, ''); - console.log(formId + 'huh'); let form = document.getElementById(formId); let type = typefield.value.toLowerCase(); showRelevantFields(form, type); @@ -110,7 +109,9 @@ } } - setEventHandlers(); - resizeTextareas(); + document.addEventListener("DOMContentLoaded", function(event) { + setEventHandlers(); + resizeTextareas(); + }); {% endblock %} diff --git a/example/models.py b/example/models.py index bee5108..50848c0 100644 --- a/example/models.py +++ b/example/models.py @@ -16,7 +16,7 @@ class Section(BaseSection): number, content, image, video, href ''' - page = models.ForeignKey(Page, verbose_name=_('page'), related_name='sections', on_delete=models.PROTECT) + page = models.ForeignKey(Page, related_name='sections', on_delete=models.PROTECT) class SectionImage(models.Model): section = models.ForeignKey(Section, related_name='images', on_delete=models.CASCADE)