Django-Forms с json-полями
Я хочу принять данные json в поле формы и проверить его с помощью некоторых операций с базой данных. Данные в основном состоят из массива целых чисел. Так что, пожалуйста, помогите мне, как я могу это сделать.
Я попытался это сделать, но не получил никакого достойного ответа. Пожалуйста, помогите.
Ответы
Ответ 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.