Skill

Stack: Django & Wagtail (Docker)

Install
1
Install the plugin
$
npx claudepluginhub syntek-dev/syntek-dev-suite --plugin syntek-dev-suite

Want just this skill?

Add to a custom plugin, then install with one command.

Description

**Last Updated**: 29/12/2025

Tool Access

This skill uses the workspace's default tool permissions.

Skill Content

Stack: Django & Wagtail (Docker)

Last Updated: 29/12/2025 Version: 1.3.1 Maintained By: Development Team Language: British English (en_GB) Timezone: Europe/London


Table of Contents


Architecture

LayerTechnology
PlatformRaw Docker (Docker Compose)
BackendPython 3.10+, Django 5.x, Wagtail 6.x
ServerGunicorn / Nginx
Testingpytest, pytest-django

Commands

TaskCommand
Start environmentdocker compose up -d
Stop environmentdocker compose down
View logsdocker compose logs -f web
Django managedocker compose exec web python manage.py <command>
Django shelldocker compose exec web python manage.py shell
Run testsdocker compose exec web pytest
Run specific testdocker compose exec web pytest tests/test_file.py -k test_name
Migrationsdocker compose exec web python manage.py migrate
Make migrationsdocker compose exec web python manage.py makemigrations
Create superuserdocker compose exec web python manage.py createsuperuser
Collect staticdocker compose exec web python manage.py collectstatic --noinput
Pip installdocker compose exec web pip install <package>

Coding Standards

Django

  • Logic lives in Services or Models, not Views
  • Views should be thin - delegate to services
  • Use class-based views for CRUD operations
  • Use function-based views for custom logic

Wagtail

  • Use StreamField for flexible content
  • Split blocks into blocks.py files
  • Use StructBlock for grouped fields
  • Keep page models focused

Templates

  • Use DTL inheritance: {% extends 'base.html' %}
  • Use {% include %} sparingly - prefer template inheritance
  • Use {% block %} for overridable sections
  • Keep logic minimal in templates

Type Hinting

CRITICAL: All Python code must use strict type hints.

from typing import Optional, List
from django.db.models import QuerySet

def get_active_users(limit: Optional[int] = None) -> QuerySet['User']:
    """
    Retrieves active users from the database.

    Args:
        limit: Maximum number of users to return. None returns all.

    Returns:
        QuerySet[User]: Active user records.
    """
    users = User.objects.filter(is_active=True)
    if limit:
        users = users[:limit]
    return users

File Structure

project/
├── apps/
│   ├── core/               # Shared functionality
│   │   ├── models.py
│   │   ├── services.py     # Business logic
│   │   └── utils.py
│   ├── users/              # User management
│   └── content/            # Wagtail content
│       ├── models.py       # Page models
│       └── blocks.py       # StreamField blocks
├── templates/
│   ├── base.html
│   └── pages/
├── static/
├── tests/
│   ├── conftest.py         # pytest fixtures
│   ├── test_models.py
│   └── test_services.py
├── docs/
│   └── METRICS/            # Self-learning system (see global-workflow skill)
│       ├── README.md
│       ├── config.json
│       ├── runs/
│       ├── feedback/
│       └── optimisations/
├── manage.py
├── docker-compose.yml
└── requirements.txt

Testing (pytest)

import pytest
from apps.users.services import UserService

@pytest.fixture
def user_service() -> UserService:
    return UserService()

def test_create_user(user_service: UserService, db) -> None:
    """Test user creation with valid data."""
    user = user_service.create(
        email='test@example.com',
        name='Test User'
    )

    assert user.email == 'test@example.com'
    assert user.is_active is True
Stats
Stars0
Forks0
Last CommitDec 29, 2025
Actions

Similar Skills