Поле JSONField

Поле JSONField в формах Django предназначено для работы с данными в формате JSON. Оно автоматически преобразует входные строки JSON в структуры Python (словари и списки) и обратно, а также выполняет валидацию корректности JSON. Поле принимает следующие параметры: required - указывает, обязательно ли поле для заполнения, initial - задает начальное значение, label - определяет метку поля, help_text - выводит подсказку, а также error_messages - позволяет переопределить стандартные сообщения об ошибках.

Синтаксис

pythonfrom django import forms

class MyForm(forms.Form):
  json_data = forms.JSONField(**options)

Пример

Создадим простую форму с JSON полем и выведем её в шаблоне:

pythonfrom 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"}
  )

Результат выполнения кода:

python<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 данных в контроллере:

pythonfrom 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})

Результат выполнения кода:

python"status": "success",
"attributes": {"color": "red", "size": "M"}

Пример

Валидация JSON данных с автоматическим преобразованием в структуры Python:

pythonfrom 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"}

Результат выполнения кода:

python"Form is valid"
"meta_data: {'age': 30, 'city': 'New York'}"

Пример

Обработка ошибок при невалидном JSON:

pythonfrom 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)

Результат выполнения кода:

python"['Enter a valid JSON.']"

Смотрите также

  • поле CharField,
    которое используется для строковых данных
  • поле ModelChoiceField,
    которое предоставляет выбор из модели
  • метод is_valid,
    который выполняет валидацию формы
  • атрибут cleaned_data,
    который содержит валидированные данные