Improve Wagtail admin editor experience for article authoring #39

Closed
opened 2026-03-03 13:44:02 +00:00 by mark · 0 comments
Owner

Problem

This is a blog-centric site, but the article authoring experience in Wagtail admin feels like a second-class citizen. Key pain points:

  1. No dedicated "Articles" menu item — editors must navigate Pages → Home → Articles to reach the article listing. Every other content type (Authors, Comments) has a top-level admin menu entry.

  2. No post scheduling or published-date controlArticlePage relies on Wagtail's built-in first_published_at (auto-set on first publish) and has no explicit published_date field. There is no way to:

    • Schedule a post to go live at a future date/time
    • Backdate a post (e.g. for migrated content)
    • Distinguish between "date published" and "date first created in Wagtail"
  3. Flat, unsorted article listing — the page explorer shows all articles in a flat list with no filtering, sorting, or status indicators beyond Wagtail's defaults. For a growing catalogue of posts this quickly becomes unwieldy.

  4. No draft/review workflow visibility — there is no at-a-glance way to see which articles are drafts, scheduled, or live from the listing.

Current Setup (analysis)

Aspect Current State
Wagtail version 7.0 (latest)
Article model ArticlePage(SeoMixin, Page) — standard Page with category, author, hero_image, summary, StreamField body, tags, read_time, comments_enabled
Content panels title, category, author, hero_image, summary, body (StreamField), tags, comments_enabled
Ordering Front-end sorts by -first_published_at; no explicit date field
Admin hooks Authors → top-level menu (snippet, add_to_admin_menu=True); Comments → top-level menu (snippet); Categories & TagMetadata → snippets (no top-level menu)
Scheduling None — no go_live_at/expire_at usage, no published_date field
StreamField blocks rich_text, code, callout, image, embed, pull_quote — good range
Page tree HomePageArticleIndexPageArticlePage (leaf)

Proposed Improvements

1. Add "Articles" to the admin menu (high priority, low effort)

Use a wagtail_hooks.py hook to register an Articles menu item. Since ArticlePage is a Page (not a snippet), the cleanest approach is:

  • Register via @hooks.register('register_admin_menu_item') to add an "Articles" link pointing to the page explorer filtered to ArticleIndexPage children.
  • Alternatively, use Wagtail's PageListingViewSet (available in Wagtail 6+) to create a dedicated Articles listing with custom columns, filters, and ordering — this gives a much better UX than the raw page explorer.

2. Add a published_date field + scheduling support (high priority, medium effort)

  • Add a published_date = models.DateTimeField(null=True, blank=True) to ArticlePage.
  • Auto-populate it from first_published_at on first publish (via save()/publish() override) so existing content migrates cleanly.
  • Expose it in content_panels so editors can override/backdate it.
  • Update all front-end queries to order by -published_date instead of -first_published_at.
  • Wagtail's built-in go_live_at / expire_at fields already exist on all Pages — surface them in the editor panels (they're hidden by default). This gives scheduling for free with zero custom code. Add them to a "Publishing" panel group alongside published_date.

3. Improve the article listing UX (medium priority, medium effort)

Using PageListingViewSet (or a custom admin view), provide:

  • Custom columns: title, author, category, published_date, status (draft/live/scheduled)
  • Filters: by category, by author, by status (draft/live/scheduled), by tag
  • Search: full-text search on title + summary
  • Default ordering: by published_date descending (most recent first)
  • Bulk actions: publish, unpublish (Wagtail provides these OOTB for pages)

4. Organise the content panels with TabbedInterface or ObjectList (low priority, low effort)

Group ArticlePage fields into logical sections:

  • Content tab: title, summary, body
  • Metadata tab: category, author, tags, hero_image, comments_enabled
  • Publishing tab: published_date, go_live_at, expire_at
  • SEO tab: existing SeoMixin panels

This reduces visual clutter on the edit screen and makes the form feel more intentional.

5. Add a simple admin dashboard panel (low priority, low effort)

Register a construct_homepage_panels hook to show a quick-glance panel on the Wagtail admin dashboard:

  • Recent drafts awaiting review
  • Scheduled posts with their go-live dates
  • Recently published articles

Out of Scope

  • Custom WYSIWYG / editor frontend (the StreamField block set is already good)
  • Permissions/workflow (single-author site for now)
  • Content calendar UI (nice-to-have for the future, overkill now)

Implementation Notes

  • All changes should be backwards-compatible with existing content (no data loss).
  • published_date migration should auto-populate from first_published_at for existing articles.
  • Wagtail 7 supports PageListingViewSet natively — prefer this over legacy ModelAdmin.
  • Test coverage for any new hooks/viewsets.
## Problem This is a blog-centric site, but the article authoring experience in Wagtail admin feels like a second-class citizen. Key pain points: 1. **No dedicated "Articles" menu item** — editors must navigate Pages → Home → Articles to reach the article listing. Every other content type (Authors, Comments) has a top-level admin menu entry. 2. **No post scheduling or published-date control** — `ArticlePage` relies on Wagtail's built-in `first_published_at` (auto-set on first publish) and has no explicit `published_date` field. There is no way to: - Schedule a post to go live at a future date/time - Backdate a post (e.g. for migrated content) - Distinguish between "date published" and "date first created in Wagtail" 3. **Flat, unsorted article listing** — the page explorer shows all articles in a flat list with no filtering, sorting, or status indicators beyond Wagtail's defaults. For a growing catalogue of posts this quickly becomes unwieldy. 4. **No draft/review workflow visibility** — there is no at-a-glance way to see which articles are drafts, scheduled, or live from the listing. ## Current Setup (analysis) | Aspect | Current State | |---|---| | **Wagtail version** | 7.0 (latest) | | **Article model** | `ArticlePage(SeoMixin, Page)` — standard Page with category, author, hero_image, summary, StreamField body, tags, read_time, comments_enabled | | **Content panels** | title, category, author, hero_image, summary, body (StreamField), tags, comments_enabled | | **Ordering** | Front-end sorts by `-first_published_at`; no explicit date field | | **Admin hooks** | Authors → top-level menu (snippet, `add_to_admin_menu=True`); Comments → top-level menu (snippet); Categories & TagMetadata → snippets (no top-level menu) | | **Scheduling** | None — no `go_live_at`/`expire_at` usage, no `published_date` field | | **StreamField blocks** | rich_text, code, callout, image, embed, pull_quote — good range | | **Page tree** | `HomePage` → `ArticleIndexPage` → `ArticlePage` (leaf) | ## Proposed Improvements ### 1. Add "Articles" to the admin menu (high priority, low effort) Use a `wagtail_hooks.py` hook to register an **Articles** menu item. Since `ArticlePage` is a Page (not a snippet), the cleanest approach is: - Register via `@hooks.register('register_admin_menu_item')` to add an "Articles" link pointing to the page explorer filtered to `ArticleIndexPage` children. - Alternatively, use Wagtail's **`PageListingViewSet`** (available in Wagtail 6+) to create a dedicated Articles listing with custom columns, filters, and ordering — this gives a much better UX than the raw page explorer. ### 2. Add a `published_date` field + scheduling support (high priority, medium effort) - Add a `published_date = models.DateTimeField(null=True, blank=True)` to `ArticlePage`. - Auto-populate it from `first_published_at` on first publish (via `save()`/`publish()` override) so existing content migrates cleanly. - Expose it in `content_panels` so editors can override/backdate it. - Update all front-end queries to order by `-published_date` instead of `-first_published_at`. - Wagtail's built-in `go_live_at` / `expire_at` fields already exist on all Pages — surface them in the editor panels (they're hidden by default). This gives scheduling for free with zero custom code. Add them to a "Publishing" panel group alongside `published_date`. ### 3. Improve the article listing UX (medium priority, medium effort) Using `PageListingViewSet` (or a custom admin view), provide: - **Custom columns**: title, author, category, published_date, status (draft/live/scheduled) - **Filters**: by category, by author, by status (draft/live/scheduled), by tag - **Search**: full-text search on title + summary - **Default ordering**: by published_date descending (most recent first) - **Bulk actions**: publish, unpublish (Wagtail provides these OOTB for pages) ### 4. Organise the content panels with `TabbedInterface` or `ObjectList` (low priority, low effort) Group `ArticlePage` fields into logical sections: - **Content** tab: title, summary, body - **Metadata** tab: category, author, tags, hero_image, comments_enabled - **Publishing** tab: published_date, go_live_at, expire_at - **SEO** tab: existing SeoMixin panels This reduces visual clutter on the edit screen and makes the form feel more intentional. ### 5. Add a simple admin dashboard panel (low priority, low effort) Register a `construct_homepage_panels` hook to show a quick-glance panel on the Wagtail admin dashboard: - Recent drafts awaiting review - Scheduled posts with their go-live dates - Recently published articles ## Out of Scope - Custom WYSIWYG / editor frontend (the StreamField block set is already good) - Permissions/workflow (single-author site for now) - Content calendar UI (nice-to-have for the future, overkill now) ## Implementation Notes - All changes should be backwards-compatible with existing content (no data loss). - `published_date` migration should auto-populate from `first_published_at` for existing articles. - Wagtail 7 supports `PageListingViewSet` natively — prefer this over legacy `ModelAdmin`. - Test coverage for any new hooks/viewsets.
mark closed this issue 2026-03-03 20:46:31 +00:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: nohype/main-site#39