Поле JSONField
Поле JSONField в формах Django предназначено для работы с данными в формате JSON. Оно автоматически преобразует входные строки JSON в структуры Python (словари и списки) и обратно, а также выполняет валидацию корректности JSON. Поле принимает следующие параметры: required - указывает, обязательно ли поле для заполнения, initial - задает начальное значение, label - определяет метку поля, help_text - выводит подсказку, а также error_messages - позволяет переопределить стандартные сообщения об ошибках.
Синтаксис
from django import forms
class MyForm(forms.Form):
json_data = forms.JSONField(**options)
Пример
Создадим простую форму с JSON полем и выведем её в шаблоне:
from django import forms
class SettingsForm(forms.Form):
name = forms.CharField(max_length=100)
preferences = forms.JSONField(
label="User preferences",
help_text="Enter JSON object with user settings",
initial={"theme": "light", "language": "en"}
)
Результат выполнения кода:
<form method="post">
<label for="id_name">Name:</label>
<input type="text" name="name" maxlength="100" id="id_name">
<label for="id_preferences">User preferences:</label>
<textarea name="preferences" id="id_preferences">
{"theme": "light", "language": "en"}
</textarea>
<span class="helptext">Enter JSON object with user settings</span>
</form>
Пример
Создадим форму для обработки JSON данных в контроллере:
from django import forms
from django.shortcuts import render
from django.http import JsonResponse
class ProductForm(forms.Form):
name = forms.CharField(max_length=200)
attributes = forms.JSONField(
label="Product attributes",
help_text='Example: {"color": "red", "size": "M"}'
)
def product_create(request):
if request.method == 'POST':
form = ProductForm(request.POST)
if form.is_valid():
attributes = form.cleaned_data['attributes']
# attributes is Python dict: {"color": "red", "size": "M"}
return JsonResponse({
"status": "success",
"attributes": attributes
})
else:
form = ProductForm()
return render(request, 'product_form.html', {'form': form})
Результат выполнения кода:
"status": "success",
"attributes": {"color": "red", "size": "M"}
Пример
Валидация JSON данных с автоматическим преобразованием в структуры Python:
from django import forms
class UserProfileForm(forms.Form):
username = forms.CharField(max_length=50)
meta = forms.JSONField(
required=False,
initial={},
error_messages={
'invalid': 'Please enter a valid JSON object'
}
)
# Usage example:
form = UserProfileForm({
'username': 'john_doe',
'meta': '{"age": 30, "city": "New York"}'
})
if form.is_valid():
meta_data = form.cleaned_data['meta']
# meta_data is Python dict: {"age": 30, "city": "New York"}
Результат выполнения кода:
"Form is valid"
"meta_data: {'age': 30, 'city': 'New York'}"
Пример
Обработка ошибок при невалидном JSON:
from django import forms
class ConfigForm(forms.Form):
settings = forms.JSONField(label="Configuration")
# Submit invalid JSON
form = ConfigForm({
'settings': '{"key": value}' # Missing quotes around value
})
if not form.is_valid():
errors = form.errors['settings']
print(errors)
Результат выполнения кода:
"['Enter a valid JSON.']"
Смотрите также
-
поле
CharField,
которое используется для строковых данных -
поле
ModelChoiceField,
которое предоставляет выбор из модели -
метод
is_valid,
который выполняет валидацию формы -
атрибут
cleaned_data,
который содержит валидированные данные