Skip to main content

Wagtail Footnotes

PyPI PyPI downloads Build Status

Add footnotes functionality to your Wagtail project.

⚡ Quick start

Add wagtail_footnotes to INSTALLED_APPS:

# settings.py

INSTALLED_APPS = [
    # ...
    "wagtail_footnotes",
    # ...
]

Add the footnotes urls.py to your project's urls.py:

# urls.py
# ...
from wagtail_footnotes import urls as footnotes_urls


urlpatterns = [
    # ...
    path("footnotes/", include(footnotes_urls)),
    # ...
]

Note: The URL has to be defined as above as it is currently hardcoded in the JavaScript.

Update your page models to show the footnotes panel:

from wagtail.models import Page
from wagtail.admin.panels import InlinePanel


class InformationPage(Page):
    # ...
    content_panels = [
        # ...
        InlinePanel("footnotes", label="Footnotes"),
    ]

Make and run migrations:

python manage.py makemigrations
python manage.py migrate

Showing footnotes in page templates

Update your page templates to include {% include "wagtail_footnotes/includes/footnotes.html" %}. You can copy from this template and instead include your own customized version.

Using footnotes in RichTextField

Update any RichTextFields that you want to add footnotes feature. Add "footnotes" to the features argument for each RichTextField that you want to have this functionality. For instance:

class InformationPage(Page):
    body = RichTextField(
        features=[
            "h1",
            "h2",
            "h3",
            "h4",
            "footnotes",  # Make sure this line is part of the features
        ],
    )

See Wagtail's documentation for a list of features that you may want to configure since we are overwriting the defaults.

Using footnotes in StreamFields

In order to have footnotes available in a RichTextBlock, you will need to change RichTextBlocks to wagtail_footnotes.blocks.RichTextBlockWithFootnotes. For instance:

from wagtail_footnotes.blocks import RichTextBlockWithFootnotes
# ...

class MyPage(Page):
    body = StreamField(
        [
            # ...
            ("paragraph", RichTextBlockWithFootnotes()),  # Using RichTextBlockWithFootnotes
            # ...
        ],
    )

Adding footnotes as a global default

You might want to simply have all RichText editors display footnotes. But remember that you will need the footnotes InlinePanel added on all your Page models for the footnotes functionality to be enabled.

# settings.py
# ...
WAGTAILADMIN_RICH_TEXT_EDITORS = {
    "default": {
        "WIDGET": "wagtail.admin.rich_text.DraftailRichTextArea",
        "OPTIONS": {"features": ["bold", "italic", "h3", "h4", "ol", "ul", "link", "footnotes"]},
    }
}

⚙️ Settings

  • WAGTAIL_FOOTNOTES_TEXT_FEATURES

    • Default: ["bold", "italic", "link"]
    • Use this to update a list of Rich Text features allowed in the footnote text.
  • WAGTAIL_FOOTNOTES_REFERENCE_TEMPLATE

    • Default: "wagtail_footnotes/includes/footnote_reference.html"
    • Use this to set a template that renders footnote references. The template receives the footnote index in its context.

🌍 Internationalisation

Wagtail Footnotes can be translated. Note that in a multi-lingual setup, the URL setup for footnotes needs to be in a i18n_patterns() call with prefix_default_language=False:

# urls.py

urlpatterns += i18n_patterns(
    path("footnotes/", include(footnotes_urls)),
    # ...
    path("", include(wagtail_urls)),
    prefix_default_language=False,
)

or outside i18n_patterns():

# urls.py

urlpattherns += [
    path("footnotes/", include(footnotes_urls)),
]
urlpatterns += i18n_patterns(
    # ...
    path("", include(wagtail_urls)),
)

💡 Common issues

  • I click on the Fn button in the editor and it stops working
    • This is likely because the URL in the JS does not match the URL of the footnotes view. Check the URL in wagtail_footnotes/static/footnotes/js/footnotes.js matches the URL you set.
  • NoneType error when rendering page.
    • Make sure you are rendering the field in the template using {% include_block page.field_name %}

Contributing

All contributions are welcome!

Install

To make changes to this project, first clone this repository:

git clone git@github.com:torchbox/wagtail-footnotes.git
cd wagtail-footnotes

With your preferred virtualenv activated, install testing dependencies:

python -m pip install -e '.[testing]' -U

pre-commit

Note that this project uses pre-commit. To set up locally:

# set up your virtual environment of choice
$ python -m pip install pre-commit
# initialize pre-commit
$ pre-commit install
# Optional, run all checks once for this, then the checks will run only on the changed files
$ pre-commit run --all-files

How to run tests

To run all tests in all environments:

tox

To run tests for a specific environment:

tox -e python3.12-django5.0-wagtail6.0

To run a single test method in a specific environment:

tox -e python3.12-django5.0-wagtail6.0 -- tests.test.test_blocks.TestBlocks.test_block_with_features

Metadata

Release files for wagtail-footnotes 0.13.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for wagtail-footnotes 0.13.0
File Size Uploaded
wagtail_footnotes-0.13.0.tar.gz 15.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for wagtail-footnotes 0.13.0
File Interpreter ABI Platform
wagtail_footnotes-0.13.0-py3-none-any.whl Python 3 none any Details

Total release size: 37.1 kB

Release files / wagtail_footnotes-0.13.0.tar.gz

Download URL wagtail_footnotes-0.13.0.tar.gz
Size 15.2 kB
Tags Source
SHA-256 checksum
How to use checksums
6a01851915641047bb9a9b2c06ca38688b0cee43e932cb4fd59e1f4373fe4d04
BLAKE2b-256 checksum
How to use checksums
1eb3b281e50b99d3bc8166ceb44a8c6485aa0981922f3e4466d89538e3f377e6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / wagtail_footnotes-0.13.0-py3-none-any.whl

Download URL wagtail_footnotes-0.13.0-py3-none-any.whl
Size 21.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
88ba2e5c7568096a4973e5be6d73535fa2a764649b8a58ea43d51d776b21c3c4
BLAKE2b-256 checksum
How to use checksums
c1513cab6005eeb91213016504b73f6479326d4e4c795d85764e39c584e1ecbc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release history Release notifications | RSS feed

0.15.0

2 release files

0.14.0

2 release files

This release

0.13.0 This release

2 release files

0.12.0

2 release files

0.11.0

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.1

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release 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