Я пытаюсь использовать форму MultiWidget в Django.Я хочу использовать пользовательский шаблон для этого виджета, в который я включаю основные встроенные шаблоны моих подвиджетов (два простых TextInputs).И я был заблокирован на некоторое время по этому поводу.
Чтобы включить шаблоны двух подвиджетов TextInput, казалось более разумным импортировать встроенные, которые сами переписывают два тега ввода HTML.Я потратил много времени, пытаясь понять, почему это не сработает:
{% for subwidget in widget.subwidgets %}
{% include subwidget.template_name %}
{% endfor %}
HTML-код, созданный с помощью этого цикла, будет выглядеть так:
<input type="" name="f" class="" required id="id_f" />
<input type="" name="f" class="" required id="id_f" />
и не сможет работать как задумано: входные значения не будут сжаты должным образом, и оба поля будут установлены на запасное значение метода декомпрессии.
И наоборот, без собственного шаблона мой мультивиджет работал как шарм, с двумя функциональными текстовыми входами, автоматически отображаемыми Django.
У меня тогда возникла идея, которую я должен был иметь в самом начале: takeвзгляните на встроенный HTML-шаблон Django для нескольких виджетов!Удивительно, но код выглядит очень похоже на мой:
{% for widget in widget.subwidgets %}
{% include widget.template_name %}
{% endfor %}
Это делает следующий HTML:
<input type="text" name="f_0" label="latitude" class="" required id="id_f_0" />
<input type="text" name="f_1" label="longitude" class="" required id="id_f_1" />
, который работает идеально (т.е. введенные значения передаются и сжимаются / распаковываются правильно).Я полагаю, что это связано с уникальными идентификаторами HTML.
Итак, в некотором смысле, я нашел ответ на свою проблему.Проблема в том, что я не понимаю, почему моя первая версия цикла не работала точно так же!Это может быть даже мое понимание Python, которого здесь может быть недостаточно, но кажется, что слова «subwidget» и «widget» в первом и втором цикле представляют один и тот же объект: элемент итерируемого widget.subwidgets.И как таковая, не должно быть никакой разницы в поведении двух циклов.
Чтобы проверить это, я попробовал это:
{% for subwidget in widget.subwidgets %}
{{ subwidget }} </br>
{% endfor %} </br>
{% for widget in widget.subwidgets %}
{{ widget }} </br>
{% endfor %}
Вывод был одинаковым для обоих циклов:
{'name': 'f_0', 'is_hidden': False, 'required': False, 'value': None, 'attrs': {'label': 'latitude', 'class': '', 'required': True, 'id': 'id_f_0'}, 'template_name': 'django/forms/widgets/text.html', 'type': 'text'}
{'name': 'f_1', 'is_hidden': False, 'required': False, 'value': None, 'attrs': {'label': 'longitude', 'class': '', 'required': True, 'id': 'id_f_1'}, 'template_name': 'django/forms/widgets/text.html', 'type': 'text'}
{'name': 'f_0', 'is_hidden': False, 'required': False, 'value': None, 'attrs': {'label': 'latitude', 'class': '', 'required': True, 'id': 'id_f_0'}, 'template_name': 'django/forms/widgets/text.html', 'type': 'text'}
{'name': 'f_1', 'is_hidden': False, 'required': False, 'value': None, 'attrs': {'label': 'longitude', 'class': '', 'required': True, 'id': 'id_f_1'}, 'template_name': 'django/forms/widgets/text.html', 'type': 'text'}
Но по какой-то причине тег include не ведет себя одинаково в двух циклах, хотя он, кажется, используется в одной и той же переменной в обоих циклах, просто его имяразные.
Почему это так?
(я не включил код моих файлов python в вопрос, чтобы не сделать его еще более длинным, и потому, что я считаю, что нет необходимости обращаться квопрос, но я буду рад добавить его, если это будет сочтено полезным)