【问题标题】:render jsonschema as a form with django-jsonschema-form or django-schemulator使用 django-jsonschema-form 或 django-schemulator 将 jsonschema 渲染为表单
【发布时间】:2019-03-30 03:13:21
【问题描述】:

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

这是来自AlpacaJS 的视频截图,它可以轻松传达应该实现的目标:

我已经对上面的两个库进行了一些测试,前者似乎维护得更好,错误更少,是 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

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

# 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. 当用户单击“提交”为 json 时从表单 POST 请求中检索数据

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

【问题讨论】:

  • 我对 json 架构了解的不够多,无法回答。我可以在此处添加我的回复作为评论,因为它没有完全回答您的问题。
  • 感谢您的回答。好吧,我不太了解的是 Django。几乎从未使用过它,只是做了一些教程,所以希望真正了解它的人可能会做出回应。不确定我提到的 2 个库是否对这个目的有用或无用..
  • (最好是 Django 1,但如果解决方案必须是 Django 2,那就用那个)
  • 我很了解 django。我只是不知道这个 json 模式是什么。所以恐怕不能帮你。
  • 大约 4 年前 committee on the internet defined jsonschema 指定 json 的模式。现在,各种库允许您根据其 jsonschema 验证一段 json。最近,前端开发人员滥用 jsonschema 来创建和验证表单。 There is an animation here(忽略 UISchema 位)。问题是这是否可以使用 Python 库而不是 JavaScript 库来完成。不过不要紧张..

标签: python django django-forms django-admin jsonschema


【解决方案1】:

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)}
    }

此代码 sn-p 将您的 PageAdmin 类注册为您的 Page 模型的 ModelAdmin

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多