Skip to main content

wagtail-block-reference

BlockReference support for Wagtail — enables forward and cyclic block references.

Heads up: this package is quite hacky. It works by monkey-patching Wagtail internals (Python and JS), which is inherently fragile. It exists because the upstream PR (wagtail#14279) may take a while to land (if it ever does), and waiting wasn't an option for me :). The test suite deliberately targets the patched internals so that a future Wagtail upgrade that breaks the patches fails loudly rather than silently misbehaving.

Installation

pip install wagtail-block-reference

Add to INSTALLED_APPS:

INSTALLED_APPS = [
    ...
    "wagtail_block_reference",
]

Usage

from wagtail import blocks
from wagtail_block_reference import BlockReference

class CommentBlock(blocks.StructBlock):
    text = blocks.CharBlock()
    replies = blocks.ListBlock(BlockReference(lambda: CommentBlock))

Targets must resolve to the same instance

A cycle ends when a walk meets a target it has already seen, and "already seen" means the same object. So a reference must resolve to the same block instance every time.

Declaring the target as a class, a dotted path, or a class attribute gives you that for free. A factory does not:

# Fine: one CommentBlock instance, memoised on the reference.
replies = blocks.ListBlock(BlockReference(lambda: CommentBlock))

# Broken: a new block on every resolution, so the graph never closes.
replies = blocks.ListBlock(BlockReference(lambda: registry.build("comment")))

The second form is an infinitely deep graph rather than a cyclic one, and no visited-set can bound it. It shows up most easily with a dynamic block registry — memoise the registry so a given name always yields the same instance.

This is caught rather than left to exhaust the stack: past WAGTAIL_BLOCK_REFERENCE_MAX_WALK_DEPTH levels (default 100), check() reports wagtailcore.E010 and other walks raise BlockReferenceDepthExceeded. Raise the setting if a graph really is nested that deeply through references.

How it works

BlockReference is a lazy proxy that resolves its target block on first access. The target can be a lambda (for forward/cyclic references), a dotted import path, or a block class.

The package ships two patches:

Python patch (patches.py, applied at import time): hooks into Wagtail's block metaclass so that BlockReference attributes declared on a StructBlock are collected as child blocks, and registers a telepath adapter so the block serialises as its resolved target.

JS patch (patch.js, injected via insert_global_admin_js): intercepts window.telepath before Wagtail's own bundles load, then wraps StructBlock and StreamBlock prototypes with a lazy childBlockDefsByName getter. Without this, the cyclic telepath graph causes a Maximum call stack size exceeded crash when the editor tries to build the block name map at construction time.

Supported versions

All Wagtail versions that are currently under active or security support: 7.0 LTS, 7.3, and 7.4 LTS. CI tests against each of these. Versions drop off the matrix as they go end-of-life.

Development

# Install dependencies
uv sync

# Lint & format
uv run ruff check .
uv run ruff format .

# Run all tests (unit + E2E) against a single Wagtail version
uv run playwright install chromium
uv run pytest tests/

# Run all tests against all supported Wagtail versions (installs Chromium automatically)
uv run tox

# Run all tests against all supported Wagtail versions (installs Chromium automatically)
# and see visually what the browser is doing
uv run tox  -- --headed --slowmo=500

# Run against a specific version
uv run tox -e wagtail74

# Run against a specific version and see visually what the browser is doing
uv run tox -e wagtail74 -- --headed --slowmo=500

License

MIT

Download files

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

Source Distribution

wagtail_block_reference-0.3.0.tar.gz (63.3 kB view details)

Uploaded Source

Built Distribution

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

wagtail_block_reference-0.3.0-py3-none-any.whl (12.1 kB view details)

Uploaded Python 3

File details

Details for the file wagtail_block_reference-0.3.0.tar.gz.

File metadata

  • Download URL: wagtail_block_reference-0.3.0.tar.gz
  • Upload date:
  • Size: 63.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for wagtail_block_reference-0.3.0.tar.gz
Algorithm Hash digest
SHA256 4367d9203adb10bae8a14c8052a92e575f4fbee473b229d9fb2f582d95aecca8
MD5 db63ff9eb481bfd3e466bbdb6bc7d4d9
BLAKE2b-256 e9378f58e7a2244e6e8081c6cad7076dfe6cd05ba74c9a4e88f878527bdbed70

See more details on using hashes here.

Provenance

The following attestation bundles were made for wagtail_block_reference-0.3.0.tar.gz:

Publisher: publish.yml on joeyjurjens/wagtail-block-reference

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file wagtail_block_reference-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for wagtail_block_reference-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 82fd5a741c26df8fa4f369c96a46bb8d284918c04788352e961f66be296479f6
MD5 dce3dd0a9f7207189fa05bb6676a6ac6
BLAKE2b-256 7868b93097807f3e1ab58092a58827e992815f35317319be2653b1f652e337e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for wagtail_block_reference-0.3.0-py3-none-any.whl:

Publisher: publish.yml on joeyjurjens/wagtail-block-reference

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.3.2

2 files

0.3.1

2 files

This release

0.3.0 This release

2 files

0.2.0

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page