Skip to main content

Django JSON form field on steroids using react-json-schema-form

Project description

https://badge.fury.io/py/django-reactive.svg https://travis-ci.org/tyomo4ka/django-reactive.svg?branch=master https://codecov.io/gh/tyomo4ka/django-reactive/branch/master/graph/badge.svg

django-reactive integrates react-jsonschema-form (RJSF) in Django projects.

Motivation

In my opinion, JSON types is an very useful feature of Postgres which allows to combine relational and non-relational approaches to storing data. In many cases it leads to simpler database design.

The JSONField in Django provides a nice way of integrating json and jsonb Postgres types with the ORM. ORM can even include JSON fields in database queries. jsonb type also offers a way of indexing JSON documents. That makes it a powerful tool in the application design and opens a wide range of use cases, e.g. polymorphic behaviour, storing complex hierarchies and lists of related entities.

However, the main limitation of JSONField in Django is that it does not offer a good way of configuring such objects in default admin UI. Defining JSON objects inside the textarea is not practical for most use cases. django-reactive tries to address this problem by offering an integration between JSONField and an awesome react-jsonschema-form (RJSF) JS library and Python’s jsonschema <https://github.com/Julian/jsonschema> for backend validation. Such integration from our practice can significantly reduce an amount of work you need to spend on building custom forms for JSONField types.

In this case developers only need to define a JSON schema for such field and optionally UI schema to modify UI of such forms.

A simple example is shown below:

from django.db import models

from django_reactive.fields import ReactJSONSchemaField


class TestModel(models.Model):
    simple = ReactJSONSchemaField(
        help_text='Simple',
        schema={
            "title": "A registration form",
            "description": "A simple form example.",
            "type": "object",
            "required": [
                "firstName",
                "lastName"
            ],
            "properties": {
                "firstName": {
                    "type": "string",
                    "title": "First name"
                },
                "lastName": {
                    "type": "string",
                    "title": "Last name"
                },
                "age": {
                    "type": "integer",
                    "title": "Age"
                },
                "bio": {
                    "type": "string",
                    "title": "Bio"
                },
                "password": {
                    "type": "string",
                    "title": "Password",
                    "minLength": 3
                },
                "telephone": {
                    "type": "string",
                    "title": "Telephone",
                    "minLength": 10
                }
            }
        },
        ui_schema={
            "firstName": {
                "ui:autofocus": True,
                "ui:emptyValue": ""
            },
            "age": {
                "ui:widget": "updown",
                "ui:title": "Age of person",
                "ui:description": "(earthian year)"
            },
            "bio": {
                "ui:widget": "textarea"
            },
            "password": {
                "ui:widget": "password",
                "ui:help": "Hint: Make it strong!"
            },
            "date": {
                "ui:widget": "alt-datetime"
            },
            "telephone": {
                "ui:options": {
                    "inputType": "tel"
                }
            }
        },
    )

It will generate a form like this:

images/simple.png

Quick start

Install django-reactive:

pip install django-reactive

Add it to your INSTALLED_APPS:

INSTALLED_APPS = (
    ...
    'django_reactive.apps.DjangoReactJsonSchemaFormConfig',
    ...
)

Run example app

  • docker-compose up

  • poetry install

  • ./example/manage.py makemigrations

  • ./example/manage.py migrate

  • ./example/manage.py createsuperuser

  • ./example/manage.py runserver

  • open http://127.0.0.1:8000/admin

  • Go to “Test model” to check a few examples

Features

  • React, RJSF and other JS assets are bundled with the package.

  • Integration with default Django admin theme.

  • Backend and frontend validation.

Limitations

To implement this behaviour you can define an array schema with one property serving as a key of the object and do transformation in your JSON class. An example will be provided later.

Future development

  • Display description as tooltips

  • Polish styles and HTML generated by RJSF

Project details


Download files

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

Source Distribution

django-reactive-0.0.4.tar.gz (355.6 kB view details)

Uploaded Source

Built Distribution

django_reactive-0.0.4-py3-none-any.whl (358.3 kB view details)

Uploaded Python 3

File details

Details for the file django-reactive-0.0.4.tar.gz.

File metadata

  • Download URL: django-reactive-0.0.4.tar.gz
  • Upload date:
  • Size: 355.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.3 CPython/3.7.4 Darwin/19.2.0

File hashes

Hashes for django-reactive-0.0.4.tar.gz
Algorithm Hash digest
SHA256 799cde888831a3160cc5ae5a80b5c1bf7b95bfde3a8ba0f884d2d262fc73e133
MD5 8a61c0fd69cce880e7e41081130ca29c
BLAKE2b-256 a73cd797dc5e16c9ffc1696c43e8c024cf423e7890cb4b9512754b06aea4ef56

See more details on using hashes here.

File details

Details for the file django_reactive-0.0.4-py3-none-any.whl.

File metadata

  • Download URL: django_reactive-0.0.4-py3-none-any.whl
  • Upload date:
  • Size: 358.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.3 CPython/3.7.4 Darwin/19.2.0

File hashes

Hashes for django_reactive-0.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 8a9f4e5f21fadff1343f1727505d0760e3bfad6b3642c6948c120e4201e8340a
MD5 8cd81c1f47d5f77308ad8aab04f360c3
BLAKE2b-256 e8c97643616da635b11625cadeaa579e8b921a4954351788ca8e1d867745b27a

See more details on using hashes here.

Supported by

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