Django应用程序通过JSON动态生成表单吗?

时间:2019-02-07 09:05:57

标签: python json django forms

我正在创建一个Django网站,我想基于JSON描述添加动态生成的表单,这些表单将来自外部来源。

例如像这样的东西:

[
    {
        "name": "first_name",
        "label": "First Name",
        "type": "char",
        "max_length": 30,
        "required": 1
    },
    {
        "name": "last_name",
        "label": "Last Name",
        "type": "char",
        "max_length": 30,
        "required": 1
    },
]

然后给我一个简单的Django表单,其中包含两个CharField,我可以将这些表单显示给用户并保存他/她输入的值以进行进一步处理。

我进行了搜索,但没有找到像这样从JSON创建Django表单的任何应用。我可以自己编写这样的应用程序,我只是想知道是否已有任何内容。

如果不是,那么您至少了解任何可用来描述表单的JSON模式格式吗?再说一次,我可以自己想办法,但我想看看一些例子,这样我就不会遗漏重要的可能性,并且有一些扎实的起点。

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以像这样使用django-jsonforms

forms.py:

Can't read from server. It may not have the appropriate access-control-origin settings

views.py:

from django.forms import ModelForm, Form
from django_jsonforms.forms import JSONSchemaField

first_name_schema = {
      "type": "object",
      "required": ["First Name"],
      "properties": {
           "First Name": {
                "type": "string",
                "maxLength": 30                 
           }
      }     
    }

last_name_schema = {          
      "type": "object",
      "required": ["Last Name"],
      "properties": {
           "Last Name": {   
                "type": "string",               
                "maxLength": 30,                    
           }
      }
    }

options = {"no_additional_properties": True}

class CustomForm(Form):    
    first_name = JSONSchemaField(schema = first_name_schema, options = options)
    last_name = JSONSchemaField(schema = last_name_schema, options = options)

some_html:

from .forms import CustomForm

def some_view(request):      
    return render(request, 'some_html.html', {'form': CustomForm()})

有关更多信息,请访问docs

修改

您可以通过修改选项字典来删除表单中的多余按钮:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>    
<form id="some_form" action="/path/to/some_view/" method="post">
     {% csrf_token %}
     {{ form.media }}
     {{ form }} 
     <button type="submit">submit</button>           
</form>