from django import forms from django.utils.safestring import mark_safe import json class PortMappingWidget(forms.Widget): template_name = "webpanel/port_mapping_widget.html" def format_value(self, value): if isinstance(value, str): try: value = json.loads(value) except json.JSONDecodeError: value = {} return value or {} def value_from_datadict(self, data, files, name): raw = {} keys = data.getlist(f"{name}_key") values = data.getlist(f"{name}_value") for k, v in zip(keys, values): if k: try: raw[k] = int(v) except ValueError: raw[k] = v return json.dumps(raw) # <-- FIX: return JSON string instead of dict def get_context(self, name, value, attrs): value = self.format_value(value) context = super().get_context(name, value, attrs) context["widget"].update({ "name": name, "value": value, }) return context