Skip to main content

crudkit

A metadata-driven CRUD framework for Django. Define models; get typed object IDs, soft delete, merge, change logging, an activity feed, saved views, AI-populated fields and a generic REST API — without writing per-model serializers, viewsets or routes.

Core concepts

Every CrudKit model inherits BaseCrudKitModel and declares a 3-letter TYPE_ID. Object IDs are rendered as <TYPE_ID><pk> (e.g. CUS42) across the API and UI.

from django.db import models
from crudkit.models import BaseCrudKitModel

class Customer(BaseCrudKitModel):
    TYPE_ID = "CUS"
    name = models.CharField(max_length=255)

    class CrudKitSettings(BaseCrudKitModel.CrudKitSettings):
        search_fields = ["name"]

Included with every model: created_by/updated_by/created_at/updated_at audit columns, a deleted soft-delete flag (soft_delete()), merge support (delete_and_merge_with()), a change log, an activity feed (FeedItem), external-system sync (ExternalObject), saved views/layouts, and optional AI fields (AISummaryField, AICategoryField, AIBooleanField, AITagsField, AIForeignKeyField) populated asynchronously via Celery and pydantic-ai.

Installation

pip install crudkit[api]          # REST API included
pip install crudkit[assistant]    # + per-object AI assistant (Channels)
INSTALLED_APPS = [
    ...,
    "rest_framework",
    "crudkit",
    "crudkit_assistant",  # optional
]

REST_FRAMEWORK = {
    "DEFAULT_PAGINATION_CLASS": "crudkit_api.pagination.CrudKitPagination",
    "DEFAULT_FILTER_BACKENDS": ["crudkit_api.filters.BasicFilter"],
    "PAGE_SIZE": 50,
}

# urls.py — one include registers a full CRUD API for every TYPE_ID model
urlpatterns = [path("api/v1/", include("crudkit_api.urls"))]

Settings

Setting Purpose
CRUDKIT_AI_MODEL pydantic-ai model string (e.g. "mistral:mistral-large-latest") enabling AI fields/assistant
CRUDKIT_AI_MODEL_FACTORY dotted path to an async context manager yielding a pydantic-ai Model (advanced)
CRUDKIT_USER_PROFILE_ADAPTER dotted path to a class supplying preferred language + avatar images for users
CRUDKIT_EXTRA_GENERIC_RELATIONS project models surfaced as generic relations in object metadata
CRUDKIT_DEFAULT_CURRENCY, CRUDKIT_CURRENCY_CHOICES currency configuration for MoneyField
CRUDKIT_GRAVATAR_FALLBACK_EMAIL fallback avatar email (gravatar mp default otherwise)
CRUDKIT_DASHBOARD_WIDGETS dotted path to a dashboard_for_user(user) widget provider
CRUDKIT_ASSISTANT_NAME, CRUDKIT_ASSISTANT_SYSTEM_PROMPT, CRUDKIT_ASSISTANT_AVATAR_URL assistant branding
CRUDKIT_FRONTEND_CONFIG dict injected into the bundled SPA at runtime (app_name, logo_url, ...)
CRUDKIT_FRONTEND_LOGIN_REQUIRED redirect anonymous users of the SPA view to LOGIN_URL

Bundled frontend

The wheel ships the built CrudKit web SPA. To serve it, add the app, the context processor, a config dict, and a catch-all url include (last!):

INSTALLED_APPS = [..., "crudkit_frontend"]

TEMPLATES = [{
    ...,
    "OPTIONS": {"context_processors": [
        ...,
        "crudkit_frontend.context_processors.crudkit_config",
    ]},
}]

CRUDKIT_FRONTEND_CONFIG = {"app_name": "My App"}  # injected into the SPA at runtime
CRUDKIT_FRONTEND_LOGIN_REQUIRED = False  # True → redirect anonymous users to LOGIN_URL

# urls.py — must be the LAST pattern; everything unmatched serves the SPA
urlpatterns = [..., path("", include("crudkit_frontend.urls"))]

Static assets are served by django.contrib.staticfiles (or WhiteNoise et al.) from crudkit_frontend/static/, under whatever STATIC_URL the project uses — nothing assumes the default static/ prefix. Contributors hacking on the SPA itself run the Vite dev server from ../frontend against any CrudKit backend; npm run build there regenerates the bundled assets.

Running the tests

cd backend
uv sync --all-extras
uv run manage.py test crudkit crudkit_api crudkit_assistant crudkit_frontend tests

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

crudkit-0.2.1.tar.gz (602.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

crudkit-0.2.1-py3-none-any.whl (604.1 kB view details)

Uploaded Python 3

File details

Details for the file crudkit-0.2.1.tar.gz.

File metadata

  • Download URL: crudkit-0.2.1.tar.gz
  • Upload date:
  • Size: 602.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for crudkit-0.2.1.tar.gz
Algorithm Hash digest
SHA256 d1ce2bdbcbf362aa3f4ed377cced5a740f51d079430f45ac9c80bc9f91d90b54
MD5 7e76244e60c450309b7340b37e5e9705
BLAKE2b-256 6acbcd565591e86f2b07700407f8515595e4f63d3ed5f5dcdac9c871ddb360d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for crudkit-0.2.1.tar.gz:

Publisher: publish-python.yml on fenerum/crudkit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file crudkit-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: crudkit-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 604.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for crudkit-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f6346e29b59ad60c4f3e9f47aced293f57d1f57bca14626abc9ef6d0754e0e2f
MD5 09f0d74e5357c3503e60c8c343d1b25a
BLAKE2b-256 ba28181a69af513dd7e92d1f02ce85806853bcb57db8d646f7db13b5bd3f60ce

See more details on using hashes here.

Provenance

The following attestation bundles were made for crudkit-0.2.1-py3-none-any.whl:

Publisher: publish-python.yml on fenerum/crudkit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page