Я нашел проблему. Он находится в исходном коде Django.
Django может конвертировать поля в HTML, только если они BoundField
. Проблема в том, что вы можете получить доступ к BoundField
"версии" полей вашей формы с помощью итерации в самой форме .
В django/forms/forms.py
:
def __getitem__(self, name):
# blabla code
if name not in self._bound_fields_cache:
self._bound_fields_cache[name] = field.get_bound_field(self, name)
Таким образом, вы можете получить HTML код только через итерацию в форме или прямой доступ к полю через form['myfield']
.
Итак, в своей форме я сделал:
class SurveyForm(forms.Form):
def field_by_id(self, field_id):
return self[field_id]
Затем я сделал в своем приложении тег шаблона:
@register.filter(name='field_by_id')
def field_by_id(arg1, arg2):
"""
Returns the result of field_by_id() (= method has to exist in arg1!)
Usage: {{ form|field_by_id:XXX }} (XXX = field id string)
:param arg1: object of class Form
:param arg2: field id string
:returns corresponding field
"""
return arg1.field_by_id(arg2)
, а затем в своем шаблоне я использую его так:
{% for question_group, questions in form.question_groups.items %}
{% for question, answers in questions.items %}
{% for answer in answers %}
{% with form|field_by_id:answer as field %}
{{ field.label }} :{{ field }} <br>
{% endwith %}
{% endfor %}
{% endfor %}
{% endfor %}
И это работает , Сложное решение, но у меня много подгрупп (я мог бы использовать FormSet
для одной подгруппы).