Подтвердить что ты не робот

Django-Forms с json-полями

Я хочу принять данные json в поле формы и проверить его с помощью некоторых операций с базой данных. Данные в основном состоят из массива целых чисел. Так что, пожалуйста, помогите мне, как я могу это сделать.

Я попытался это сделать, но не получил никакого достойного ответа. Пожалуйста, помогите.

4b9b3361

Ответ 1

Вам нужно взять его как текстовый ввод, используя CharField. И в чистом методе этого поля вы можете проверить его в соответствии с вашим требованием проверить правильность ввода.

Что-то вроде:

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.

Ответ 2

Вы можете создавать формы с полями из данных 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))

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)

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>

Результат:

Ответ 3

Отметьте django-json-field, который реализует поле JSONField и связанное с ним поле.

Ответ 4

Там самый популярный репозиторий github с реализацией JSONField. Вы можете установить его с помощью:

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

Ответ 5

django.contrib.postgres имеет поле формы JSONField. Вот ссылка на документы. Поле представлено HTML <textarea>.

from django import forms
from django.contrib.postgres.forms.jsonb import JSONField

class ExampleForm(forms.Form):
    ...

    metadata = JSONField()
    ...

Ответ 6

По простому:

Вы не хотите изменять поведение всех ваших форм по умолчанию, просто используйте одну функцию, которая преобразует ваш запрос в объекты.

form = myForm(jsonForm(request))

if form.is_valid():
   # Continue your stuffs 

Вы можете преобразовать тело запроса в объекты Python и передать его в форму вместо прямой передачи запроса.

def jsonForm(req):
    return json.loads(req.body.decode('utf-8'))

Ответ 7

Если ваша Django-модель содержит JSON-поле с именем, скажем, scope, которое либо является django.contrib.postgres.forms.jsonb.JSONField либо 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.