带有json字段的Django-Forms

Sar*_*tra 15 django django-forms

我希望接受表单字段中的json数据,而不是使用某些数据库操作验证它.数据主要由整数数组组成.那么请你帮我一下,我该怎么办呢.

我试图谷歌这个,但没有得到任何体面的答案.请帮忙.

Roh*_*han 21

您需要使用它作为文本输入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
Run Code Online (Sandbox Code Playgroud)

您还可以找到JSON数据输入的自定义字段.


Abb*_*der 6

您可以使用该决定使用 JSON数据中的字段创建表单

例:

forms.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))
Run Code Online (Sandbox Code Playgroud)

views.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)
Run Code Online (Sandbox Code Playgroud)

template.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>
Run Code Online (Sandbox Code Playgroud)

结果: