No project description provided
Project description
Django App Help
Filesystem-backed Markdown help for Django applications. Help content lives in your Git repository, deploys read-only with the app, and renders in the browser through django-wildewidgets.
Use it for in-app guidance, workflow documentation, field explanations, and operational notes — not as a full CMS.
Features
- Canonical Markdown pages under
help/pages/ - Audience-specific books defined in YAML under
help/books/ - Reusable snippets via
::includedirectives - Cross-page links with
help:URLs and asset references withasset:URLs HelpEnginefor loading, rendering, and validating contentHelpOffcanvasMixinto attach a help panel to Wildewidgets views
Installation
Install the package and its runtime dependencies:
pip install django-app-help
Or:
uv add django-app-help
Or, from a checkout of this repository:
uv sync
Dependencies include Django, PyYAML, django-markdownify, and django-wildewidgets.
Help content layout
Point Django at a help root directory with this structure:
help/
├── books/
│ ├── user.yaml
│ └── admin.yaml
├── pages/
│ ├── getting-started/
│ │ └── welcome.md
│ └── topics/
│ └── pages.md
├── snippets/
│ └── support-contact.md
└── assets/
└── images/
-
Page IDs are paths under
pages/without.md(for examplegetting-started/welcome). -
Books list page IDs in sections for different audiences. The same page can appear in multiple books.
-
Snippets are included in pages with a whole-line directive:
::include snippets/support-contact.md
-
Links reference other pages and assets:
[Navigation](help:getting-started/navigation) 
Pages may include YAML front matter (title, summary, audience, and so on). The engine strips front matter before rendering.
Django setup
Settings
Add the app (optional — there are no database models, but this keeps the integration explicit):
INSTALLED_APPS = [
# ...
"markdownify",
"wildewidgets",
"app_help",
]
Set the filesystem help root and import the recommended Markdownify settings:
from pathlib import Path
from app_help.conf import MARKDOWNIFY # noqa: F401
APP_HELP_ROOT = Path(__file__).resolve().parent / "myapp" / "help"
app_help.conf.MARKDOWNIFY whitelists the HTML tags help pages need when rendered through django-markdownify.
Wildewidgets views
Use HelpOffcanvasMixin on a Wildewidgets view. List it before StandardWidgetMixin so cooperative get_context_data() can build page content first, then wrap it with the help offcanvas:
from app_help.views import HelpOffcanvasMixin
from wildewidgets import MenuMixin, StandardWidgetMixin
from django.views.generic import TemplateView
class MyPageView(HelpOffcanvasMixin, MenuMixin, StandardWidgetMixin, TemplateView):
help_page_id = "getting-started/welcome"
help_book_slug = "user" # optional; omit to skip book membership checks
help_offcanvas_title = "Help"
help_book_url_name = "app-help" # optional full-book footer link
def get_content(self):
# return your Wildewidgets layout
...
Configure help per view with class attributes:
| Attribute | Purpose |
|---|---|
help_root |
Override settings.APP_HELP_ROOT |
help_page_id |
Page to render (required) |
help_book_slug |
Require the page to be listed in this book |
help_offcanvas_id |
DOM id for the offcanvas (default help-offcanvas) |
help_offcanvas_title |
Panel title (default Help) |
help_book_url_name |
Optional URL name for a full-book help footer link |
Override get_help_root(), get_help_page_id(), or get_help_book_slug() when the active page depends on the request.
Full-book help view
Use HelpBookViewMixin on a Wildewidgets view to render the selected book inside your application chrome. Wire it to a project URL named app-help if offcanvas pages should link to it:
from app_help.views import HelpBookViewMixin
from django.urls import path
from django.views.generic import TemplateView
from wildewidgets import MenuMixin, StandardWidgetMixin
class AppHelpView(HelpBookViewMixin, MenuMixin, StandardWidgetMixin, TemplateView):
help_book_slug = "user"
def get_help_book_slug(self):
# Return the book appropriate to request.user.
return "admin" if self.request.user.is_staff else "user"
urlpatterns = [
path("help/", AppHelpView.as_view(), name="app-help"),
]
Programmatic use
Render or validate content without a view:
from app_help import HelpEngine
engine = HelpEngine("/path/to/help")
markdown = engine.render_page("getting-started/welcome", book_slug="user")
page = engine.load_page("getting-started/welcome")
book = engine.load_book("user")
engine.validate_page("getting-started/welcome")
engine.validate_book("user")
render_page() expands snippet includes, strips front matter, and optionally verifies that the page belongs to the requested book.
Command-line interface
After installation, the django-app-help command is available for authoring and CI workflows without running Django.
Bootstrap a help tree
django-app-help init
django-app-help init --root /path/to/myapp
This creates help/ with example book, page, and snippet content under the project root (current directory by default).
List and render content
Point the CLI at your help root with --help-root or the APP_HELP_ROOT environment variable. If ./help exists, it is used automatically.
django-app-help --help-root demo/demo/core/help books
django-app-help --help-root demo/demo/core/help pages
django-app-help --help-root demo/demo/core/help pages getting-started/welcome
django-app-help --help-root demo/demo/core/help snippets
django-app-help --help-root demo/demo/core/help show book user
Render a page with optional book membership check:
django-app-help --help-root demo/demo/core/help pages billing/overview --book user
Validate content
django-app-help --help-root demo/demo/core/help validate page billing/overview
django-app-help --help-root demo/demo/core/help validate book user
django-app-help --help-root demo/demo/core/help validate all
Use validate in CI by exporting APP_HELP_ROOT to your help directory.
Demo
The demo/ directory is a small Django project that shows help wired into Academy-themed Wildewidgets pages. It installs this package in editable mode and serves sample content from demo/demo/core/help/.
Run the demo
From the repository root:
uv sync
cd demo
uv sync
uv run python manage.py runserver
Open http://127.0.0.1:8000/. Each sidebar route renders a static demo page with a help offcanvas:
| Route | Help book | Help page |
|---|---|---|
/ |
user |
getting-started/welcome |
/components/ |
user |
topics/pages |
/workflow/ |
developer |
authoring/pages |
/status/ |
admin |
admin/validation |
/help/ |
user |
Full book |
Browse the Markdown under demo/demo/core/help/ to see books, pages, snippets, includes, and link patterns in context. demo/demo/core/views.py shows how HelpOffcanvasMixin composes with StandardWidgetMixin.
Development
Run the library test suite from the repository root:
make pytest
Pass extra pytest arguments after the target:
make pytest ARGS="tests/test_engine.py -v"
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_app_help-0.3.0.tar.gz.
File metadata
- Download URL: django_app_help-0.3.0.tar.gz
- Upload date:
- Size: 25.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cdcc9389ae28625685bc43c9e5547750761f31c44b92e1754f3dc8dcdb3832d3
|
|
| MD5 |
5615d2a2840d943988261a8d13681754
|
|
| BLAKE2b-256 |
7f827e8e1af0d06ffa9d2dcd975e634c52c0cfbf026327da7b3d4ca537c1f9be
|
File details
Details for the file django_app_help-0.3.0-py3-none-any.whl.
File metadata
- Download URL: django_app_help-0.3.0-py3-none-any.whl
- Upload date:
- Size: 25.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1302fb8f3064dff4a32010f7901daff8615fb0b58e78df8e9361f769896079ae
|
|
| MD5 |
9a442b11cf6e7bf5fe2107e0d3f11322
|
|
| BLAKE2b-256 |
a4eb96a735df128fa9ec9f9f42f849de31ac5dc9e850c8c5eeb89f07403641e3
|