Template Reference

Every page extends layout.html, either directly or through one of the page layouts below. A page can only fill a block that the template it extends defines.

Blocks in layout.html

  • page_title: the page's <title> tag. By default it shows the site name, plus the page's title if one is set. Override it to write your own.
  • meta_description: empty slot in <head> for a meta description tag.
  • tags: empty slot in <head> for extra meta tags.
  • jsonld: end of <head>, for structured data. Include js/json-ld.html here.
  • staff_toolbar: yellow bar at the top of the page with an "Edit This Page" button, shown only to staff on slug pages. Override it to replace or remove the bar.
  • pageHeader: inside the page's <header> (masthead) area.
  • pageContent: inside <main>. The main body of the page.
  • contact: in the footer, above the footer bar.
  • captchaScript: end of <body>, after the Bootstrap and htmx scripts. Used for the reCAPTCHA script on form pages.

Base layouts (layout/)

  • layout/no_contact.html: plain page based on layout.html. Used by the login, signup, and password pages.

Page layouts (layouts/)

Each one fills pageContent with a page structure and adds its own blocks inside it.

  • centered-card-form: a centered card, for forms. Adds top_left and middle_article.
  • table-list: a titled list or table page. Adds top_left (defaults to a heading), top_right, and middle_article.
  • two-col_article-left_sidebar-right: an article with a sidebar, used by wiki pages. Adds left_col, middle_article, bottom_box, and right_col.
  • two-col_feed-left_filters-right: a feed with a filter column. Adds top_left (defaults to a heading), top_right, left_col, and right_col.
  • hero-feature-grid: a hero area above a content section. Adds top_center and middle_article.
  • hero-video: a video hero in pageHeader, with content in middle_article.

Components

  • comment-form: a reply/comment form. Renders a Django form's fields, or an example textarea if none is passed.
  • comment-thread: a thread of comments, with edit and delete controls when can_manage is set.
  • decision-panel: shows a submitted request's fields, then either an approve/deny form or a decision banner.
  • divider: a decorative two-line horizontal divider.
  • image_carousel: a hero image carousel from a list of slides.
  • recaptcha_script: macro that adds a reCAPTCHA v3 token to a form on submit. Needs site_key in the page context.
  • tile: a card with an optional image, title, and body.
  • profile: a full profile page (extends layout/no_contact.html), not a reusable piece.

Sections

  • empty_state: macro for a centered "nothing here" message, with optional icon, title, and button.
  • feature-grid: a grid of cards built from tile.
  • left-col-img_right-col-article: an image beside an article. Set flip to swap the sides.
  • search_bar: macro for a search form, with optional clear link and button.

Widgets

  • dynamic-formset: add and remove rows of a Django formset in the browser.
  • slot-picker: a grid of time-slot buttons, each available or disabled.
  • sort-toggle-table: a sortable table with search and pagination. Goes in table-list's middle_article.
  • status-control-panel: a filter sidebar with status tabs, filters, and a sort menu.

Macros

  • pagination: a page navigation bar, shown only when there's more than one page.

Using a component

Most files are added with {% include "path/file.html" %}. The ones marked "macro" are used with {% load macros %} and then {% use_macro name ... %}. Each file's opening comment shows its exact usage.

Pages Here

No sub-pages yet.

Page Info

Wiki: Docs

Created on Nov 2, 2026 by Marissa Swing

Maintainers

Editor Last Activity
Marissa Swing creator Nov 2, 2026