我希望在表单字段中接受 json 数据,然后使用一些数据库操作对其进行验证。数据将主要由整数数组组成。所以你能帮我看看我该怎么做。
我试图用谷歌搜索,但没有得到任何体面的答案。请帮忙。
我希望在表单字段中接受 json 数据,然后使用一些数据库操作对其进行验证。数据将主要由整数数组组成。所以你能帮我看看我该怎么做。
我试图用谷歌搜索,但没有得到任何体面的答案。请帮忙。
您需要使用CharField
. 在该字段的 clean 方法中,您可以根据您的要求对其进行验证,以检查输入是否有效。
就像是:
class myForm(forms.Form):
jsonfield = forms.CharField(max_length=1024)
def clean_jsonfield(self):
jdata = self.cleaned_data['jsonfield']
try:
json_data = json.loads(jdata) #loads string as json
#validate json_data
except:
raise forms.ValidationError("Invalid data in jsonfield")
#if json data not valid:
#raise forms.ValidationError("Invalid data in jsonfield")
return jdata
您还可以找到用于 JSON 数据输入的自定义字段。
您可以根据该决定使用 JSON 数据中的字段制作表单
例子:
表格.py
# -*- coding: utf-8 -*-
from django import forms
from splitjson.widgets import SplitJSONWidget
class testForm(forms.Form):
attrs = {'class': 'special', 'size': '40'}
data = forms.CharField(widget=SplitJSONWidget(attrs=attrs, debug=True))
视图.py
# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from django.template import RequestContext
from forms import testForm
def test_dict(request):
json = {'a': 1,
'b': 2,
'c': 3,
'd': 4}
form = testForm(request.POST or None, initial={'data': json})
if form.is_valid():
# validate and save
pass
template = 'test_template.html'
context = RequestContext(request, {'form': form})
return render_to_response(template, context)
模板.py
<!doctype html>
<html>
<head></head>
<body>
Errors:
{% for field, error in form.errors.items %}
<ul>
<li>{{ error }}</li>
</ul>
{% empty %}
no errors
{% endfor %}
<hr/>
List of:
<form action="" method="post">
{% csrf_token %}
{{ form.as_p}}
<input type="submit" value="Submit" />
</form>
</body>
</html>
结果:
检查实现 JSONField 和相关表单字段的 django-json- field。
如果你的 Django 模型包含一个名为的 JSON 字段,比如scope
,它要么是 a 要么是django.contrib.postgres.forms.jsonb.JSONField
a jsonfield.fields.JSONField
,那么简单地将你的 Django 重写ModelForm
为:
from django.form import fields
from entangled.forms import EntangledModelForm
class MyForm(EntangledModelForm):
field1 = fields.CharField()
...
class Meta:
entangled_fields = {'scope': ['field1', ...]}
该类EntangledModelForm
是 Django 的一个特殊变体,ModelForm
必须从第三方库django-entangled导入。
这允许您编辑一个或多个 JSON 字段,并具有标准 Django 表单提供的所有好处,例如表单验证和数据清理。
有JSONField实现的最流行的 github 存储库。您可以使用以下方式安装它:
pip install jsonfield
例如,如果您有一个模型
from jsonfield import JSONField
from django.db import models
class MyModel(models.Model):
json_field = JSONField(default='', blank=True)
您可以简单地定义一个带有 JSON 验证的表单
from django import forms
from jsonfield.fields import JSONFormField
from myapp import models
class MyModelForm(forms.ModelForm):
class Meta:
model = models.MyModel
fields = '__all__'
field_classes = {
'json_field': JSONFormField,
}
并在您的管理模型中使用此表单
from django.contrib import admin
from myapp.forms import MyModelForm
from myapp.models import MyModel
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
form = MyModelForm
django.contrib.postgres
有一个 JSONField 表单字段。这是docs的链接。字段由 HTML 表示<textarea>
。
from django import forms
from django.contrib.postgres.forms.jsonb import JSONField
class ExampleForm(forms.Form):
...
metadata = JSONField()
...
简单来说:
您不想更改所有表单的默认行为,只需使用一个函数即可将您的请求转换为对象。
form = myForm(jsonForm(request))
if form.is_valid():
# Continue your stuffs
您可以将请求正文转换为 Python 对象并传递给您的表单,而不是直接传递请求。
def jsonForm(req):
return json.loads(req.body.decode('utf-8'))