Приложение Django, как динамически генерировать форму на основе JSON?

В настоящее время я делаю следующее:

[
  {
    "name": "hostname",
    "type": "string",
    "description": "Hostname router",
    "required": "Yes" (No if it is not required)
  },
  {
    "name": "is_dhcp",
    "type": "choice",
    "description": "DHCP?",
    "choices": [
      [
        "yes",
        "Yes"
      ],
      [
        "no",
        "No"
      ]
    ],
    "required": "No"
  },
  {
    "name": "gateway",
    "type": "ip",
    "description": "Gateway DHCP",
    "required": "Yes"
  },
  {
    "name": "sub_int_bck",
    "type": "integer",
    "description": "In case of existing! - Sub interface",
    "required": "No"
  },
  {
    "name": "exIpList",
    "type": "list",
    "description": "List excluded IPs, seperated by ;",
    "required": "No"
  }
]

Затем я использую большое количество If для проверки одного за другим:

if var_type.lower() == 'string':
                    self.fields[var_name] = forms.CharField(
                        label=var_description,
                        required=var_req_bool,
                        widget=forms.TextInput(attrs={"class": "form-control"})
                    )
                elif var_type.lower() == 'integer':
                    self.fields[var_name] = forms.IntegerField(
                        label=var_description,
                        required=var_req_bool,
                        widget=forms.TextInput(attrs={"class": "form-control"})
                    )
                elif var_type.lower() == 'choice':
                    self.fields[var_name] = forms.ChoiceField(
                        label=var_description,
                        choices=var.get('choices', []),  # Default to empty list if not provided
                        widget=forms.Select(attrs={"class": "form-control"}),
                        required=var_req_bool
                    )
                elif var_type.lower() == 'ip' and 'mask' in var_description.lower():
                    self.fields[var_name] = forms.GenericIPAddressField(
                        label=var_description,
                        required=var_req_bool,
                        widget=forms.TextInput(attrs={"class": "form-control", "placeholder": "255.255.255.0 OU 0.0.0.255 OU 24"}),
                    )
                elif var_type.lower() == 'ip':
                    self.fields[var_name] = forms.GenericIPAddressField(
                        label=var_description,
                        required=var_req_bool,
                        widget=forms.TextInput(attrs={"class": "form-control", "placeholder": "192.168.1.1"}),
                    )
                elif var_type.lower() == 'list':
                    self.fields[var_name] = forms.CharField(
                        label=var_description,
                        required=var_req_bool,
                        widget=forms.Textarea(attrs={"class": "form-control"}),
                    )
                elif var_type.lower() == 'bool':
                    self.fields[var_name] = forms.BooleanField(
                        label=var_description,
                        required=var_req_bool,
                        widget=forms.CheckboxInput(attrs={"class": "form-control"}),
                    )

Цель - собрать все переменные, необходимые для создания шаблона jinja2 с конфигурациями для маршрутизаторов и коммутаторов.

В настоящее время меня пугают следующие вещи:

1 - Есть группы конфигураций, которые являются необязательными, но в настоящее время мне нужно отобразить все, поэтому предположим, что общее количество переменных 30, но есть 3 группы по 10 переменных. Если пользователь скажет "нет" одной группе, он все равно увидит остальные 9 вопросов, даже если они не нужны, что приводит к большой раздутости.

2 - Я думаю, что будет много альтернативных тегов, и это внесет путаницу (я думаю), в настоящее время мне нужно добавить по крайней мере еще 2 тега, потому что мне нужно определить, является ли это обычной маской подсети, обратной или префиксной. Это беспокоит меня, потому что даже если все задокументировано, это, вероятно, вызовет путаницу при создании json (Это должно быть сделано вручную)

Есть ли способ упростить это?

Я делаю это правильно или есть лучший или более умный способ сделать это?

Я создал эту JSON-логику с нуля, поскольку не знаю ни одного пакета django, который мог бы помочь мне в создании динамических форм.

Но мне кажется, что он становится слишком сложным для обслуживания, когда для создания конфигураций требуется 20+ переменных.

Вернуться на верх