Как вызвать метод формы из шаблона для динамической формы в 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]
проблема заключается в следующем:
- Дополнительное поле не отображалось в web
- Из консоли я не увидел никаких признаков того, что вызывается MailTemplateForm.get_schemas. .
Пожалуйста, подскажите мне, как вызвать метод(ы) формы из шаблона.
Искренне
-bino-