Enhanced features for django-blog-lotus: CTAs, cover styling, webhooks, and more
Project description
Django Blog Plus
Enhanced features for django-blog-lotus, providing additional functionality for professional blogging.
Features
- Call to Action (CTA) Blocks: Create reusable CTA components and assign them to articles
- Article Cover Styling: Customize cover image backgrounds with preset or custom colors
- View Tracking: Track article views for popular/trending widgets
- Webhook API: Create and update articles programmatically via REST API
- Scheduled Publishing: Automatically publish draft articles at scheduled times
- RSS/Atom Feeds: Full syndication support with category feeds
- SEO Enhancements: Sitemaps, reading time, heading optimization
- Premium Templates: Modern, responsive blog templates
Installation
pip install django-blog-plus
Quick Start
- Add to your
INSTALLED_APPS:
INSTALLED_APPS = [
# ...
'smart_media',
'ckeditor',
'ckeditor_uploader',
'lotus', # django-blog-lotus
'django_blog_plus',
# ...
]
- Configure settings (optional):
#############################################################
# Smart Media (required by django-blog-lotus)
#############################################################
from smart_media.settings import * # noqa: E402,F401,F403
#############################################################
# Lotus (django-blog-lotus)
#############################################################
from lotus.settings import * # noqa: E402,F401,F403
SITE_ID = 1 # Required by django.contrib.sites (used by lotus)
#############################################################
# Django Blog Plus
#############################################################
DJANGO_BLOG_PLUS = {
'SITE_NAME': 'My Blog',
'SITE_DESCRIPTION': 'A blog about interesting things',
'WEBHOOK_SECRET': 'your-secret-key',
'ARTICLE_PUBLISHED_WEBHOOK_URL': '', # Optional Zapier/n8n webhook
'BASE_TEMPLATE': 'base.html', # Your project's base template
'DEFAULT_COVER_BG_COLOR': '#f8f9fa',
}
#############################################################
# CKEditor configuration
#############################################################
CKEDITOR_UPLOAD_PATH = "uploads/"
CKEDITOR_ALLOW_NONIMAGE_FILES = False
CKEDITOR_RESTRICT_BY_DATE = False
CKEDITOR_IMAGE_BACKEND = "ckeditor_uploader.backends.PillowBackend"
CKEDITOR_BROWSE_SHOW_DIRS = True
# Suppress CKEditor deprecation warning (known issue, upgrade to CKEditor 5 planned)
SILENCED_SYSTEM_CHECKS = ['ckeditor.W001']
CKEDITOR_CONFIGS = {
"lotus": {
"width": "100%",
"height": 400,
"language": "{{ language }}",
"skin": "moono-lisa",
"startupOutlineBlocks": True,
"extraPlugins": "image2",
"image_previewText": True,
"removePlugins": "stylesheetparser",
"allowedContent": True,
"toolbar": "Default",
"toolbar_Default": [
["Undo", "Redo"],
["ShowBlocks"],
["Format", "Styles"],
["RemoveFormat"],
"/",
["Bold", "Italic", "Underline", "-", "Subscript", "Superscript"],
["JustifyLeft", "JustifyCenter", "JustifyRight"],
["TextColor"],
["Link", "Unlink"],
["Image", "-", "NumberedList", "BulletedList", "-", "Table", "-", "CreateDiv", "HorizontalRule"],
["Source"],
],
},
}
- Add URL patterns:
from django.urls import path, include
urlpatterns = [
# ...
# CKEditor for rich text editing in blog
path('ckeditor/', include('ckeditor_uploader.urls')),
# Blog
path('blog/', include('lotus.urls')),
path('api/blog/', include('django_blog_plus.urls')),
# ...
]
- Run migrations:
python manage.py migrate django_blog_plus
- Add context processor (for blog categories in templates):
TEMPLATES = [
{
# ...
'OPTIONS': {
'context_processors': [
# ...
'django_blog_plus.context_processors.blog_categories',
'django_blog_plus.context_processors.django_blog_plus_config',
],
},
},
]
Configuration Reference
| Setting | Default | Description |
|---|---|---|
SITE_NAME |
'Blog' |
Site name for RSS feeds |
SITE_DESCRIPTION |
'' |
Site description for RSS feeds |
WEBHOOK_SECRET |
None |
Bearer token for webhook API authentication |
ARTICLE_PUBLISHED_WEBHOOK_URL |
'' |
URL to call when articles are published |
BASE_TEMPLATE |
'base.html' |
Base template that blog templates extend |
DEFAULT_COVER_BG_COLOR |
'#f8f9fa' |
Default background color for article covers |
COVER_BG_COLORS |
(preset list) | Available background color choices |
When the context processor django_blog_plus.context_processors.django_blog_plus_config is enabled, these options are available in templates as django_blog_plus_* context variables: django_blog_plus_site_name, django_blog_plus_site_description, django_blog_plus_base_template, django_blog_plus_primary_color, django_blog_plus_default_cover_bg_color, django_blog_plus_cover_bg_colors, django_blog_plus_language_code. Sensitive options (WEBHOOK_SECRET, ARTICLE_PUBLISHED_WEBHOOK_URL) are not exposed in context.
Webhook API
Create Article
curl -X POST https://yoursite.com/api/blog/webhook/ \
-H "Authorization: Bearer YOUR_SECRET" \
-H "Content-Type: application/json" \
-d '{
"title": "My Article",
"content": "<h2>Hello</h2><p>World</p>",
"category_slug": "news",
"status": "published"
}'
Update Article
curl -X PATCH https://yoursite.com/api/blog/webhook/update/ \
-H "Authorization: Bearer YOUR_SECRET" \
-H "Content-Type: application/json" \
-d '{
"article_url": "/blog/2024/01/15/my-article/",
"title": "Updated Title"
}'
See /api/blog/webhook/info/ for full API documentation.
Template Tags
{% load django_blog_plus %}
{# Reading time #}
{% reading_time article.content %} min read
{# Previous/Next navigation #}
{% get_adjacent_articles article as nav %}
{% if nav.previous %}Previous: {{ nav.previous.title }}{% endif %}
{# Article CTA #}
{% get_article_cta article.id as cta %}
{% if cta %}{{ cta.title }}{% endif %}
{# Popular articles #}
{% get_popular_articles 5 as popular %}
{# Cover background color #}
{{ article|article_cover_bg }}
Management Commands
# Publish scheduled articles (run via cron)
python manage.py publish_scheduled_articles
# Clean up placeholder images
python manage.py remove_blog_placeholder_images --dry-run
Changelog
See CHANGELOG.md for the full changelog.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Contributing
Contributions are welcome! Please open an issue or pull request on GitHub.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_blog_plus-1.0.7.tar.gz.
File metadata
- Download URL: django_blog_plus-1.0.7.tar.gz
- Upload date:
- Size: 88.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d280f976de138f1f27038b772a195e3db18322ad63b68b7dc81f86415b2d2ce2
|
|
| MD5 |
26032453fccb1cd4898af6bba874d99e
|
|
| BLAKE2b-256 |
ce3b9dd35e67f6715d9ddeba3de7bc95bbe9b33bb052f5fd4ea127cee226fbb3
|
File details
Details for the file django_blog_plus-1.0.7-py3-none-any.whl.
File metadata
- Download URL: django_blog_plus-1.0.7-py3-none-any.whl
- Upload date:
- Size: 99.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d8414f9a5cf08dd5ffbcd6ecd0e5350725353e152792a9977abe6d87354fa6ba
|
|
| MD5 |
bd2252f9e915c843493a1ab441d5747a
|
|
| BLAKE2b-256 |
7eddd9533b9c5d1612d496542a6974127ca7e81ca86afed246708d9f7b04e11c
|