schon/core/widgets.py
2025-10-06 15:58:30 +03:00

43 lines
1.4 KiB
Python

import json
from typing import Any
from django import forms
from django.forms.renderers import DjangoTemplates
class JSONTableWidget(forms.Widget):
template_name = "json_table_widget.html"
def format_value(self, value: str | dict[str, Any]):
if isinstance(value, dict):
return value
try:
if isinstance(value, str):
value = json.loads(value)
except json.JSONDecodeError:
value = {}
return value
def render(
self, name: str, value: str | dict[str, Any], attrs: dict | None = None, renderer: DjangoTemplates | None = None
):
value = self.format_value(value)
return super().render(name, value, attrs, renderer)
# noinspection PyUnresolvedReferences
def value_from_datadict(self, data: dict[str, Any], files: list, name: str):
json_data = {}
try:
keys = data.getlist(f"{name}_key")
values = data.getlist(f"{name}_value")
for key, value in zip(keys, values, strict=True):
if key.strip():
try:
json_data[key] = json.loads(value)
except (json.JSONDecodeError, ValueError):
json_data[key] = value
except TypeError:
pass
return None if not json_data else json.dumps(json_data)