Skip to content
GitHubDiscord

Admin (lexigram-admin)

Modern Python-first admin framework for Lexigram — HTMX, CRUD, dashboards, and extensions.


Auto-generated admin panel for the Lexigram Framework. Provides CRUD interfaces, bulk actions, role-based access, and audit logging for any domain model — with zero frontend code required.

Built on lexigram-ui for responsive UI components and integrates with lexigram-auth for RBAC permission enforcement. Configure via AdminModule.configure() and register resources with the admin site.

Terminal window
uv add lexigram-admin
# Optional extras
uv add "lexigram-admin[auth,saml,ldap,oauth2,export]"
from lexigram import Application
from lexigram.di.module import Module, module
from lexigram.admin import AdminModule, ModelAdmin, admin_site
@admin_site.register(Product)
class ProductAdmin(ModelAdmin):
list_display = ["id", "name", "price", "is_active"]
list_filter = ["is_active", "category"]
search_fields = ["name", "sku"]
@module(imports=[AdminModule.configure()])
class AppModule(Module):
pass
app = Application(modules=[AppModule])
if __name__ == "__main__":
app.run()

Zero-config usage: Call AdminModule.configure() with no arguments to use defaults.

application.yaml
admin:
prefix: /admin
title: "My App Admin"
features:
audit_logging: true
Section titled “Option 2 — Profiles + Environment Variables (recommended)”
Terminal window
export LEX_ADMIN__ENABLED=true
export LEX_ADMIN__TITLE="Production Admin"
from lexigram.admin.config import AdminConfig
config = AdminConfig(
prefix="/admin",
title="My App Admin",
features=AdminFeaturesConfig(audit_logging=True),
)
AdminModule.configure(config)
FieldDefaultEnv varDescription
prefix/adminLEX_ADMIN__PREFIXURL prefix for all admin routes
titleLexigram AdminLEX_ADMIN__TITLEPanel title shown in browser and header
auth.session_secretchange-me-in-productionLEX_ADMIN__AUTH__SESSION_SECRETSecret for signing session cookies (required in production)
auth.session_lifetime86400LEX_ADMIN__AUTH__SESSION_LIFETIMESession validity in seconds (default: 24h)
auth.idle_timeout3600LEX_ADMIN__AUTH__IDLE_TIMEOUTIdle session expiry in seconds
features.audit_loggingtrueLEX_ADMIN__FEATURES__AUDIT_LOGGINGLog every write action with user and diff
resource_defaults.per_page20LEX_ADMIN__RESOURCE_DEFAULTS__PER_PAGEDefault rows per page
ui.themesystemLEX_ADMIN__UI__THEMEUI colour scheme (light, dark, or system)
MethodDescription
AdminModule.configure(...)Configure with explicit config, auth provider, resources, or controllers
AdminModule.stub()Minimal config for testing
  • Auto CRUD — List, detail, create, edit, delete with zero boilerplate
  • Smart list — Sortable columns, inline filters, pagination, search bar
  • Bulk actions — Multi-select operations with progress and error summaries
  • Row actions — Per-row buttons for custom single-object operations
  • Auth integration — Plugs into lexigram-auth RBAC; per-model permission guards
  • Audit log — Every write action logged with user, timestamp, diff
  • Change history — Per-object change history with diff viewer
  • Password policy — Configurable complexity rules for admin users
  • Custom pages@admin_site.page(path="/reports") for bespoke views
async with Application.boot(modules=[AdminModule.stub()]) as app:
# your test code
...
FileWhat it contains
src/lexigram/admin/module.pyAdminModule definition with factory methods
src/lexigram/admin/di/bundle_provider.pyAdminBundleProvider wiring
src/lexigram/admin/config.pyAdminConfig and all config sub-models