20

我希望在表单字段中接受 json 数据,然后使用一些数据库操作对其进行验证。数据将主要由整数数组组成。所以你能帮我看看我该怎么做。

我试图用谷歌搜索,但没有得到任何体面的答案。请帮忙。

4

7 回答 7

27

您需要使用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 数据输入的自定义字段。

于 2013-01-31T13:31:52.060 回答
7

您可以根据该决定使用 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>

结果:

于 2013-07-17T00:41:30.527 回答
2

检查实现 JSONField 和相关表单字段的 django-json- field。

于 2013-02-17T10:46:19.063 回答
2

如果你的 Django 模型包含一个名为的 JSON 字段,比如scope,它要么是 a 要么是django.contrib.postgres.forms.jsonb.JSONFielda 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 表单提供的所有好处,例如表单验证和数据清理。

于 2019-07-01T06:49:12.090 回答
1

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
于 2018-09-23T17:17:40.463 回答
1

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()
    ...
于 2019-03-04T17:15:40.160 回答
0

简单来说:

您不想更改所有表单的默认行为,只需使用一个函数即可将您的请求转换为对象。

form = myForm(jsonForm(request))

if form.is_valid():
   # Continue your stuffs 

您可以将请求正文转换为 Python 对象并传递给您的表单,而不是直接传递请求。

def jsonForm(req):
    return json.loads(req.body.decode('utf-8'))
于 2019-07-01T05:35:05.983 回答