django-native-jsonform
Build nested, server-validated JSON editors from JSON Schema using ordinary
Django Field, Widget, Form, and ModelForm primitives.
django-native-jsonform is intended for applications that store configurable
data in models.JSONField but still want Django's validation, permissions,
widgets, templates, admin integration, and extension points.
Highlights
- Objects, arrays, nested arrays, choices, local
$ref, and discriminatedoneOfbranches. - Native Django fields and server-side validation—no client-only JSON editor.
- Independent Draft 2020-12 document validation, including composition, conditionals, tuple arrays, dynamic properties and registered references.
- Replaceable native JSON editors for structures without generated child widgets.
- Dynamic schemas with access to the current request, user, object, and form.
- Exact-path,
*, and**overrides for fields, widgets, attributes, serializers, defaults, permissions, and templates. - Cloneable registries for project-specific JSON formats and widgets.
- Sparse JSON preservation: displayed defaults do not have to be persisted.
- Unknown-key preservation for forward-compatible and permission-aware forms.
- Template-driven rendering and small progressive-enhancement JavaScript.
Installation
python -m pip install django-native-jsonform
INSTALLED_APPS = [
# ...
"django_native_jsonform",
]
Quick start
from django import forms
from django_native_jsonform import JSONSchemaFormField, JSONSchemaModelForm
from .models import Product
PRODUCT_SCHEMA = {
"type": "object",
"properties": {
"title": {"type": "string", "title": "Title"},
"price": {"type": "number", "minimum": 0},
"tags": {
"type": "array",
"items": {"type": "string"},
},
},
"required": ["title"],
}
class ProductForm(JSONSchemaModelForm):
metadata = JSONSchemaFormField(schema=PRODUCT_SCHEMA, required=False)
class Meta:
model = Product
fields = "__all__"
For Django admin, add JSONSchemaAdminMixin so callable schemas and factories
receive the current request context:
from django.contrib import admin
from django_native_jsonform import JSONSchemaAdminMixin
@admin.register(Product)
class ProductAdmin(JSONSchemaAdminMixin, admin.ModelAdmin):
form = ProductForm
Customize a project-specific format
from django import forms
from django_native_jsonform import FieldFactoryContext, default_registry
registry = default_registry.clone()
@registry.register_field("string", format="media-asset")
def media_asset_field(context: FieldFactoryContext) -> forms.Field:
return MediaAssetField(
user=context.form_context.user,
schema=context.schema,
required=context.required,
)
class ProductForm(JSONSchemaModelForm):
metadata = JSONSchemaFormField(schema=PRODUCT_SCHEMA, registry=registry)
The package does not depend on a particular rich text editor, media library, autocomplete implementation, or design system. Those are registered by each consumer.
Documentation
The complete wiki lives in docs/ and is published at
barcelona-dev.github.io/django-native-jsonform.
Start with the quick start, then see customization and building extensions.
Status
The API is currently alpha. It was extracted from a production Django
application, but semantic-versioning compatibility begins with 1.0.
License
MIT
Optional DRF and JSON:API serializers
Generate serializers from your JSON Schema using
django_native_jsonform.rest_framework.serializer_from_schema, or attach
JSONSchemaField to a model serializer's JSON attribute. Install the drf or
jsonapi extra. Opt-in json_api=True converts nested keys using the project's
JSON:API formatting configuration while keeping schema validation in one place.
See the DRF integration guide
for PATCH semantics, references and examples.
Metadata
Release files for django-native-jsonform 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| django_native_jsonform-0.4.0.tar.gz | 61.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_native_jsonform-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 100.7 kB
Release files / django_native_jsonform-0.4.0.tar.gz
| Download URL | django_native_jsonform-0.4.0.tar.gz |
|---|---|
| Size | 61.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ee5acd84418b06c05bdc1f273dcd90ab3070c41689d1971c9d4cb91c8802a052
|
|
BLAKE2b-256 checksum How to use checksums |
9f2c41d207b84d13a86be4d5dc1e8a03539d11bcf9685ef56c51866e91bb1eba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / django_native_jsonform-0.4.0-py3-none-any.whl
| Download URL | django_native_jsonform-0.4.0-py3-none-any.whl |
|---|---|
| Size | 38.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
485de939406bedeb0c12be692be5f2184e8d1522204125aab91af8be623d6301
|
|
BLAKE2b-256 checksum How to use checksums |
eb244875792d1bb3b649bbe050180913c20b011358c28606451d5c4b4e54dc3e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency log