python - 使用 django-jsonschema-form 或 django-schemulator 将 jsonschema 呈现为一种形式

标签 python django django-forms django-admin jsonschema

JSON Schema很容易与 Angular、React 和 Alpaca 等前端 JavaScript 库一起使用,以创建带验证的 html 表单。这也适用于 Python 解决方案 django-jsonschema-formdjango-schemulator但我是 Django 的新手,在解决它时遇到了很多麻烦..

这是来自 AlpacaJS 的视频截图它很容易传达这应该实现的目标:

JSON Schema becomes a form

我已经对上面的两个库进行了一些测试,前者似乎维护得更好并且错误更少,是 PyPI 中唯一的两个库。

我用 Django 1.11.4 创建的目录树如下所示:

.
├── db.sqlite3
├── jschemaforms
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
├── myproject
│   ├── __init__.py
│   ├── settings.py
│   ├── templates
│   │   ├── base.html
│   │   └── includes
│   ├── urls.py
│   └── wsgi.py
└── README.md

docs为 django-jsonschema-form 指定一个类:

# Overriding widgets for all instances of JSONField on PageAdmin form
class PageAdmin(admin.ModelAdmin):
    formfield_overrides = {
        JSONField: {'widget': JSONSchemaWidget(schema)}
    }

这样的类应该放在目录树中的什么位置?

schema 是您输入的用于定义表单的 json 片段

我查看了这个 SO 问题中的各种答案,试图找出答案:

Django Admin - Overriding the widget of a custom form field

似乎 forms.py 和 ModelAdmin 对象足以实现这一点,但我不确定 ModelAdmin 对象应该位于树中的哪个位置。

如何使用 Django 实现这一点?

  1. 从 jsonschema 渲染表单
  2. 在客户端根据 jsonschema 验证用户在表单中输入的内容
  3. 当用户点击“提交”时从表单 POST 请求中检索数据作为 json

我不确定这两个库是否是答案..

最佳答案

PageAdmin 类位于名为 admin.py 的文件中,位于其对应的 model.py 旁边。这是 Django 1.11 docs on discovering admin files .

您还必须为您的模型注册管理员。你使用 django.contrib.admin.register 装饰器。同一页面也包含此装饰器的文档。

用法是这样的

from somewhere import Page
from django.contrib import admin

# Overriding widgets for all instances of JSONField on PageAdmin form
@admin.register(Page)
class PageAdmin(admin.ModelAdmin):
    formfield_overrides = {
        JSONField: {'widget': JSONSchemaWidget(schema)}
    }

此代码片段将您的 PageAdmin 类注册为您的 Page 模型的 ModelAdmin

关于python - 使用 django-jsonschema-form 或 django-schemulator 将 jsonschema 呈现为一种形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52990430/

相关文章:

python - Mongo 查询中的 AND 和 OR

python - 如何将时间拆分为小时?

python - 下订单时出现错误201交互式经纪人tws

django - 如何以 django 形式显示不可编辑字段

基于 Django 类的 View - 具有两种模型表单的 UpdateView - 一种提交

python - opencv安装中的python错误

python - Cron 作业(使用 django_cron)不更新对象

django - 如何修复此错误 django.db.utils.OperationalError : could not translate host name "db" to address . Docker

django - '用户' 对象没有属性 'username'

python - 使用 clean() 对带有下划线的字段进行 ModelForm 验证