Django MVP
Get your Django project to a minimum viable product — fast. django-mvp gives you a polished, settings-configurable application layout (DaisyUI 5 + Tailwind CSS v4), a library of reusable django-cotton UI components, and enhanced class-based views with search, ordering and pagination out of the box. Things should just work.
Note: django-mvp is in active development (0.x). Import paths and component APIs may change between minor versions — see the CHANGELOG.
What you get
- A complete app shell — sidebar, navbar, content area, footer, and mobile dock
navigation, rendered around every page and configured from Django settings
(pydata-sphinx-theme style): sidebar collapse breakpoint, offcanvas vs. icon-rail
collapse, and navbar widgets are all
MVP_CONFIGkeys. - A Cotton component library — cards, buttons, grids, menus, dropdowns, pagination, hero sections and more, with small consistent attribute APIs. Need more control? Override the component's template in your project — that's the intended extension path, not a bigger API.
- Views that do the boring parts — list pages with admin-style search, whitelisted ordering and pagination; form pages with automatic crispy-forms detection; delete flows with related-object summaries and type-to-confirm; styled error pages.
- Menus in Python — sidebar and mobile-dock navigation via django-flex-menus, with active states, icons and badges handled for you.
- Icons by name — every icon resolves through django-easy-icons; swap the icon set from settings without touching templates.
- No build tooling required — a prebuilt stylesheet ships with the package. When your own templates need their own Tailwind classes, one management command generates the build config.
Quick start
pip install django-mvp
# settings.py
INSTALLED_APPS = [
...
"django.contrib.sites",
"django_cotton",
"easy_icons",
"flex_menu",
"mvp",
]
TEMPLATES = [{
...
"OPTIONS": {"context_processors": [
...
"mvp.context_processors.mvp_config",
]},
}]
EASY_ICONS = {
"default": {
"renderer": "easy_icons.renderers.ProviderRenderer",
"config": {"tag": "i"},
"packs": ["mvp.utils.BS5_ICONS"], # icons used by mvp's own components
},
}
FLEX_MENUS = {
"renderers": {
"sidebar": "mvp.renderers.SidebarRenderer",
"dock": "mvp.renderers.MobileFooterNavRenderer",
},
}
{# templates/dashboard.html #}
{% extends "mvp/base.html" %}
{% block content %}
<c-container>
<c-section title="Dashboard" icon="home">
<c-grid md="2" xl="4">
<c-card title="Orders">150 new</c-card>
<c-card title="Revenue">$12,400</c-card>
</c-grid>
</c-section>
</c-container>
{% endblock %}
Full walkthrough: Getting Started.
Configure the layout from settings
MVP_CONFIG = {
"layout": {
"sidebar": {
"breakpoint": "lg", # sm|md|lg|xl|2xl — when the sidebar is persistent
"collapse": "offcanvas", # "offcanvas" (slide away) or "icons" (icon rail)
},
"navbar": {
# Cotton component names, rendered at the right end of the navbar
"end": ["actions.theme-controller", "actions.language-switcher"],
},
},
}
Per-page overrides use component attributes (<c-app breakpoint="xl">,
<c-app.sidebar collapse="icons">). Details: Layout.
Views in one line each
from mvp.views import MVPListView, MVPCreateView, MVPUpdateView, MVPDeleteView
class ProductListView(MVPListView):
model = Product
search_fields = ["name", "description"] # ?q= multi-word search
order_by = [("name_asc", "Name (A-Z)", "name")] # ?o= whitelisted ordering
class ProductCreateView(MVPCreateView):
model = Product
fields = ["name", "category", "price"] # crispy-detected rendering
Details: Views.
Menus in Python
# myapp/menus.py
from flex_menu import MenuItem
from mvp.menus import AppMenu
AppMenu.extend([
MenuItem(name="dashboard", view_name="dashboard",
extra_context={"label": "Dashboard", "icon": "home"}),
])
Details: Navigation.
Optional integrations
Views that build on third-party packages live in guarded modules — no extras, and the dependency is only required when you import the integration:
from mvp.integrations.django_tables.views import MVPTableView # django-tables2
from mvp.integrations.django_filters.views import MVPFilteredListView # django-filter
Details: Integrations.
Styling & Theming
Django MVP is styled with Tailwind CSS v4 + DaisyUI 5 and ships a prebuilt stylesheet — most projects need no build tooling. Use the packaged components (and DaisyUI themes for colors) and you're done.
If your own templates use their own Tailwind utility classes, rebuild the CSS with the generated entry file, which scans your templates and Django MVP's:
npm install -D tailwindcss @tailwindcss/cli daisyui
python manage.py mvp_tailwind > assets/tailwind.css
npx @tailwindcss/cli -i assets/tailwind.css -o static/css/app.css --minify
See docs/styling.md for the full guide (two-tier model, theming, and the packaged Tailwind preset).
Documentation
Start at docs/index.md: Getting Started · Layout · Components · Navigation · Views · Styling · Integrations.
Requirements
- Python 3.12+
- Django 5.2+ (currently supported Django releases)
- django-cotton, django-flex-menus, django-easy-icons (installed automatically)
Design philosophy
- Things should just work — sensible defaults, minimum ceremony, MVP first.
- Configuration-driven — layout and behavior controlled via
settings.MVP_CONFIG. - Basic components, not a component framework — small attribute APIs; extensive customization happens by overriding templates.
- Focused integrations — only for packages the author reuses across projects; the guarded-module pattern makes rolling your own trivial.
Use cases
Admin dashboards, data-management tools, research portals, internal apps, SaaS back-offices — anywhere you want a production-looking, data-centric Django app without building the UI layer first.
Contributing
Contributions welcome! When adding components: use <c-vars /> for defaults, no ghost
attributes, include ARIA attributes, and add tests (tests/test_components/ renders
every packaged component). Rebuild the stylesheet with invoke build-stylesheet when
templates change classes — CI fails on drift.
License
MIT License — see LICENSE.
Acknowledgments
Built with django-cotton by @wrabit, DaisyUI, Tailwind CSS, Alpine.js and Bootstrap Icons.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_mvp-0.14.1.tar.gz.
File metadata
- Download URL: django_mvp-0.14.1.tar.gz
- Upload date:
- Size: 115.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91062c71a9eff9f51701835025e33e8c3587c4792a390bee58fef4ee04bb5160
|
|
| MD5 |
ec5b0d41134945e0bb9840d38b8cfd65
|
|
| BLAKE2b-256 |
dd22b2aefaf24a7459f272ce6b6b78b352bccc9463db5554d93f3809d7457134
|
Provenance
The following attestation bundles were made for django_mvp-0.14.1.tar.gz:
Publisher:
on-release-main.yml on django-mvp/django-mvp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
django_mvp-0.14.1.tar.gz -
Subject digest:
91062c71a9eff9f51701835025e33e8c3587c4792a390bee58fef4ee04bb5160 - Sigstore transparency entry: 2172992797
- Sigstore integration time:
-
Permalink:
django-mvp/django-mvp@458bf6f4c2610a0c3930e887949f1f8b498cb68f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/django-mvp
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
on-release-main.yml@458bf6f4c2610a0c3930e887949f1f8b498cb68f -
Trigger Event:
workflow_run
-
Statement type:
File details
Details for the file django_mvp-0.14.1-py3-none-any.whl.
File metadata
- Download URL: django_mvp-0.14.1-py3-none-any.whl
- Upload date:
- Size: 153.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
71625db369f96767bf6ef72b8a273689cecf67e0b5af0d8ce7f3cebba6ae6362
|
|
| MD5 |
b473044581cec283438b67bcb755de6c
|
|
| BLAKE2b-256 |
433edc5668ecd449f72225cd46cc22c73206841f14de184645aca8ee09143e9a
|
Provenance
The following attestation bundles were made for django_mvp-0.14.1-py3-none-any.whl:
Publisher:
on-release-main.yml on django-mvp/django-mvp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
django_mvp-0.14.1-py3-none-any.whl -
Subject digest:
71625db369f96767bf6ef72b8a273689cecf67e0b5af0d8ce7f3cebba6ae6362 - Sigstore transparency entry: 2172992801
- Sigstore integration time:
-
Permalink:
django-mvp/django-mvp@458bf6f4c2610a0c3930e887949f1f8b498cb68f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/django-mvp
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
on-release-main.yml@458bf6f4c2610a0c3930e887949f1f8b498cb68f -
Trigger Event:
workflow_run
-
Statement type: