Skip to main content

A reusable blog app powered by Python, Django, DRF, Wagtail CMS, TailwindCSS and DaisyUI.

Project description

django-w-blog

CI CD Code Style: Black Code Linting: Ruff Docker Image Docker Publish PyPI - Version PyPI - Python Version PyPI - Downloads PyPI - License

Overview

A reusable, production-ready blog application built with Python, Django, Django REST Framework, and Wagtail CMS, styled with Tailwind CSS and daisyUI. It ships with sane defaults, modern theming, and clean APIs to help you launch quickly and scale confidently.


Demo

<iframe width="560" height="315" src="https://www.youtube.com/embed/NiBgi7huGbY?si=MEUZzjAGSGzgs3JZ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

Key features

  • Full CMS: Wagtail-powered editorial experience with pages, media, search, and governance.
  • Modern UI: Tailwind CSS for utility-first styling and responsive layouts.
  • Theming: All daisyUI themes supported, plus the ability to define custom themes.
  • API ready: Optional REST API endpoints for content delivery and integrations.
  • CI/CD: GitHub Actions pipelines for consistent, automated testing and deployment.
  • Dependencies: Managed with Poetry for reproducibility and clarity.
  • Formatting: Black for automatic, consistent code formatting.
  • Linting: Ruff for fast, comprehensive linting.
  • Testing: Django test runner for unit and integration tests.
  • Configs included: .gitignore, pyproject.toml, and other boilerplate to streamline setup.

Installation

pip install django-w-blog

Configuration

Add installed apps

# project/settings.py

INSTALLED_APPS = [
    "blog",
    "blog.api",  # Optional if you don't need the API
    "blog.apps.articles",
    "blog.apps.categories",
    "blog.apps.home",      # Optional if your project includes a Home model ('home.Home')
    "blog.apps.indexes",
    "blog.apps.tags",
    "blog.cms",
    "blog.ui",

    # Dependencies
    "rest_wind",           # Optional if you don't need the API
    "rest_framework",      # Optional if you don't need the API
    "wagtail_blocks",
    "wagtail.contrib.search_promotions",
    "wagtail.contrib.forms",
    "wagtail.contrib.redirects",
    "wagtail.embeds",
    "wagtail.sites",
    "wagtail.users",
    "wagtail.snippets",
    "wagtail.documents",
    "wagtail.images",
    "wagtail.search",
    "wagtail.admin",
    "wagtail",
    "modelcluster",
    "taggit",
    # ...
]

Run migrations

# In your project root
python manage.py migrate

Update URL configuration

# project/urls.py

from django.urls import include, path
from wagtail import urls as wagtail_urls
from wagtail.admin import urls as wagtailadmin_urls
from wagtail.documents import urls as wagtaildocs_urls

urlpatterns = [
    path("", include("blog.ui.urls")),
    path("api/", include("blog.api.urls")),           # Optional if you don't need the API
    path("api/", include("rest_framework.urls")),     # Optional if you don't need the API
    # ...
    path("documents/", include(wagtaildocs_urls)),
    path("dashboard/", include(wagtailadmin_urls)),
    path("", include(wagtail_urls)),                  # Keep this as the last pattern
]

Theming and templates

Each template in django-w-blog extends blog/base.html. Start by creating this base template in your project and customize it to match your brand.

Create the blog template directory

mkdir -p your_app/templates/blog

Create the base template

touch your_app/templates/blog/base.html

You can extend blog/base.html in your own templates or override any provided template for full control.

Available blocks and context

  • blog/base.html

    • Blocks:
      • theme: Default daisyUI theme
      • toggle_theme: Secondary daisyUI theme
      • head: HTML head content
      • title: Page title
      • styles: CSS styles links
      • navbar: Navigation bar
      • branding: Branding in navbar
      • navbar_center: Centered navbar links
      • navbar_end: Right-aligned navbar links
      • content: Main content
      • footer: Page footer
      • drawer_branding: Sidebar branding
      • drawer_content: Sidebar content
    • Context:
      • home: Site root page
  • blog/index.html

    • Blocks: All blocks from blog/base.html
    • Context:
      • index: Blog index page
      • articles: Latest blog articles
  • blog/category.html

    • Blocks: All blocks from blog/base.html
    • Context:
      • category: Category instance
  • blog/article.html

    • Blocks: All blocks from blog/base.html
    • Context:
      • article: Article instance
  • blog/search.html

    • Blocks: All blocks from blog/base.html
    • Context:
      • search_results: Results as a PageQuerySet

Contributing

We welcome contributions. Please review the CONTRIBUTING guide for setup, coding standards, and workflow. Opening an issue before major changes helps align on scope and direction.


Support

For questions, bug reports, or feature requests, open an issue or start a thread in GitHub Discussions.


License

This project is available under the MIT License. See the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_w_blog-0.1.9.tar.gz (57.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_w_blog-0.1.9-py3-none-any.whl (83.8 kB view details)

Uploaded Python 3

File details

Details for the file django_w_blog-0.1.9.tar.gz.

File metadata

  • Download URL: django_w_blog-0.1.9.tar.gz
  • Upload date:
  • Size: 57.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.2.1 CPython/3.12.3 Linux/6.11.0-1018-azure

File hashes

Hashes for django_w_blog-0.1.9.tar.gz
Algorithm Hash digest
SHA256 06971c882b4db662e5ac25616675e86db8fbca3eea0ac0346c39e8dce093a711
MD5 259dd78028481d1915e732effa7013a1
BLAKE2b-256 2e24ae82a91d11e4bea3e9b538b0b5cce6cd8c5396644a59c168f673c443083e

See more details on using hashes here.

File details

Details for the file django_w_blog-0.1.9-py3-none-any.whl.

File metadata

  • Download URL: django_w_blog-0.1.9-py3-none-any.whl
  • Upload date:
  • Size: 83.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.2.1 CPython/3.12.3 Linux/6.11.0-1018-azure

File hashes

Hashes for django_w_blog-0.1.9-py3-none-any.whl
Algorithm Hash digest
SHA256 42adc01cedc2ff1e98ca112ac3e88313f80fd27405e35bf5836cb1106b552bcc
MD5 401d78f8ad045f060e83b9dc2f0ab056
BLAKE2b-256 b34dd01489ce925b9e95e6c8dcf0679413ef986e0a8dd12ff35e9c877b81d8e5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page