Как вызвать метод формы из шаблона для динамической формы в django

У меня есть модель, одно из полей которой CharField, используется для хранения JSON (список словаря) под названием 'schema'

SCHEMA_DATA_TYPES=(
  (1, 'Integer'),
  (2, 'String'),
  (3, 'Date'),
)

    
class MailTemplate(models.Model):
  name = models.CharField(max_length=20)
  tfile = models.FileField(upload_to='uploads/mailtemplate', null=True, blank=True)
  schema = models.CharField(max_length=256, blank=True, null=True, editable=False)
  def __str__(self) -> str:
    return self.name

В настоящее время у него только одна запись и значение 'schema' равно :

[{"name": "date", "label": null, "type": 2, "format": ""}, {"name": "invoiceNumber", "label": null, "type": 2, "format": ""}, {"name": "company", "label": null, "type": 2, "format": ""}, {"name": "total", "label": null, "type": 2, "format": ""}, {"name": "items", "label": null, "type": 2, "format": ""}]

Мне нужно построить динамическую форму, которая имеет дополнительные поля, конструируемые из этого поля 'schema'.

Первая попытка - я использую htmx. Форма отображается прекрасно, но дополнительные поля не могут быть прочитаны forms.py

Как предложил пользователь SO @vinkomlacic в моем посте How to read additional data posted by form in django forms.py, I serach for doc on how to play with init of form to do it.

Я нашел https://www.caktusgroup.com/blog/2018/05/07/creating-dynamic-forms-django/ выглядит информативным.

Итак, мой файл admin.py имеет вид

class MailTemplateAdmin(admin.ModelAdmin):
  change_form_template = 'mailtemplate_form.html'
  form = MailTemplateForm
  
admin.site.register(MailTemplate,MailTemplateAdmin)

и mailtemplate_form.html является


{% extends "admin/change_form.html" %}
{% block after_field_sets %}

  {% if not add %}
    <div id="schema_head">
      <b>Schema  </b>
    </div>
    <div id="additional_fields">    
      {% for schema_line in form.get_schemas %}
        {{ schema_line }}
      {% endfor %}
    </div>
  {% endif %}
{% endblock %}

и forms.py имеют


class MailTemplateForm(forms.ModelForm):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    schema = self.instance.schema.strip() 
    #print(f'INSTANCE:{schema}')
    schema = json.loads(schema)
    for i in range(len(schema)):
      self.fields[f'schema_{i}_name'] = forms.CharField(max_length=20, initial=schema[i]['name'])
      self.fields[f'schema_{i}_name'].widget.attrs["readonly"] = True
      self.fields[f'schema_{i}_label'] = forms.CharField(max_length=20, required = True, initial=schema[i]['label'])
      self.fields[f'schema_{i}_type'] = forms.ChoiceField(choices=SCHEMA_DATA_TYPES,initial=schema[i]['type'])
      self.fields[f'schema_{i}_format'] = forms.CharField(max_length=20, required = True, initial=schema[i]['format'])
    #print(f'FIELDS: {self.fields}')


  def get_schemas(self):
    print('get_schemas CALLED!')
    for s in self.fields:
      if s.startswith('schema_'):
        yield self.fields[s]

проблема заключается в следующем:

  1. Дополнительное поле не отображалось в web
  2. Из консоли я не увидел никаких признаков того, что вызывается MailTemplateForm.get_schemas.
  3. .

Пожалуйста, подскажите мне, как вызвать метод(ы) формы из шаблона.

Искренне
-bino-

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