Skip to content

Features at a glance

Everything django-vantage does, one short paragraph each, with a link to the full page. Unless it says otherwise, a feature works the moment the package is installed: nothing here needs configuring before you can use it.

Getting set up

Auto-registration. Add vantage to INSTALLED_APPS, mount site.urls, and every model in the project gets a list, detail, create, edit and delete page. Framework noise (sessions, content types, permissions) is left out. Getting started

Inference. Columns, filters, search fields, sort order, form widgets and query joins are worked out from each model. Set one attribute on a panel and only that attribute changes; the rest stay inferred. Inference

Panels. A panel.py next to models.py holds the overrides, in ordinary Python with names a ModelAdmin user already knows (list_display, search_fields, readonly_fields…). Panels

vantage_scaffold. Prints a real panel.py containing everything that was inferred, so you can see the decisions and take ownership of any of them. See what was inferred

manage.py check. Every field name in a panel is validated at check time, so a typo fails loudly instead of quietly dropping a column. Check your configuration

Configure from the UI too. Columns, filters, stats, the dashboard, the sidebar and the branding can also be changed in the panel without a deploy. One fixed order decides who wins: UI override, then panel.py / VANTAGE, then inference. How configuration resolves

Lists

Data grid. Sortable columns, a filter rail with counts, relative date filters ("last 30 days"), full-text search and pagination. Lists

Board, calendar, gallery and map. The same list as a Kanban board, a month calendar, an image gallery or a map, picked from a switcher. Each view is inferred from the model, and Group by / Dates from let anyone choose the field from the page. List views

Saved views. Save a combination of filters, search, sort and view under a name, keep it private or share it. Saved views

Inline editing. Edit chosen columns in the grid. Changes collect in a pending bar and are saved together in one transaction, with a conflict check if someone else changed the row. Inline cell editing

Grouping, trees and trash. Group rows by a field, browse tree-shaped models, and get a Trash tab with Restore on any model with a deleted_at or is_deleted column. Grouping, trees and trash

Bulk actions. Decorate a panel method with @action and it appears on the list. "Select all matching" works on forty thousand rows as cheaply as on three, and big jobs can run in the background. Bulk actions

Undo. Deletes, bulk edits and inline edits show a toast with an Undo button for a few seconds. Nothing is ever restored over somebody else's newer change. Undo

Export and import. CSV, TSV and JSON export of exactly what you are looking at, and a CSV import wizard that maps, previews and validates before writing anything. Export · Import

Customise a list from the page. The Customise rail lets a person reorder and hide columns, pick filters and add stats for themselves, or for everyone if they may. The customisation rail

Numbers and charts

Summary bar. A footer that sums money columns, averages ratings and leaves identifiers alone, with no configuration. The summary bar

Stats and charts. Declare Stat and Chart on a panel; they follow the current filters, compare against the previous period, and render as inline SVG. Analytics

Dashboard. Stat, chart, table and list cards declared in Python, or built and rearranged from the UI. Dashboards

Records and forms

Inferred forms. Widgets chosen per field type — searchable pickers for big relations, a colour picker, image thumbnails, a JSON editor — grouped into sections. Forms

Layout DSL. Tabs, Tab, Section and Row arrange the form when the inferred grouping is not what you want. The layout DSL

Editable inlines. Edit child records on the parent's page, in one transaction. Editable inlines

Duplicate and bulk edit. Both reuse exactly the form and validation a single record uses. Duplicating a record · Bulk edit

Cascade-delete preview. Before a delete, see everything it takes with it, counted. Cascade-delete preview

History. Every change made through the panel is in the record's history, with a diff. The audit log

Access and safety

Permissions. Django's model permissions out of the box, with object-level and row filtering hooks, enforced on every page, action and API call. django-guardian and django-rules are picked up if installed. Permissions

Roles. Manage Django groups as roles in a permission matrix: tick view / add / change / delete per model, review the diff, save once. Nobody can grant a permission they do not hold. Roles

Sensitive fields. Fields named like password, api_token, iban or card_number are masked everywhere — lists, exports, search, the API, the audit log. A permitted user can reveal one value at a time, and each reveal is logged. Sensitive fields

Read-only mode. One setting turns every write off, for a maintenance window or a replica. Read-only mode

Impersonation. See the panel as another user, with a banner you cannot miss. Impersonation

Audit log. Who changed what, when, from where, with a diff. The audit log

Multi-tenancy. Scope every model to the current tenant with one setting. Anything it cannot scope is refused, not shown. Multi-tenancy

Security hardening. Login throttling, CSP nonces, upload validation and --deploy checks. Security

Look and feel

Brand colour. One colour becomes a full light and dark palette, contrast-checked. Logo, title and theme can also be set from the settings screen. Theming

Theme presets. Pick a whole look — vantage, shadcn, slate, rose and more — in one line, and let each person choose their own from the account page. UI theme presets

Light, dark and system. With no flash on load. Light, dark and system

Right to left and translations. RTL layouts and English and Arabic catalogues ship in the box. Internationalization

Environment banner. A coloured banner so nobody mistakes production for staging. The environment banner

Accessibility. Keyboard navigation, labelled controls and visible focus throughout. Accessibility

Getting around

Command palette. ⌘ K jumps to any model, record, page or action. The command palette

Global search. Search across every model you can see, from the top bar. Global search

Sidebar. Group, rename, reorder and hide entries with VANTAGE["NAV"], or from the UI. A nav entry can hide a model, never grant access to one. Settings reference

Schema map. A live diagram of your models and how they relate, every box a link. The built-in pages

Operations

Data quality. A read-only audit of every model for empty fields, duplicate candidates, broken references and odd dates. manage.py vantage_data_quality --fail-on warn runs the same audit in CI. Data quality

System page. Migrations, cache, database and task backend at a glance. The system page

Query-count guarantees. Joins are derived from what each page renders, and tests assert the number of queries does not grow with the number of rows. Query cost

Extending it

Custom pages. A class with a title and a get_context method becomes a page with a URL and a nav entry. Custom pages

Slots. Put your own HTML into named places in the shell. Slots

Plugins. A package can add panels, pages and widgets through an entry point. Plugins

JSON API. Every panel as a JSON API, through the same permission and validation path as the UI. The JSON API

contrib.admin adapter. Existing admin.py files can be served by Vantage. The contrib.admin adapter