После дополнительных исследований проблемы, представленной в вопросе, я нашел решение и решил написать его здесь.
Доступ к атрибутам формы ввода с использованием Django синтаксиса шаблона находятся в все случаи просты, кроме случаев, когда ключ содержит специальный символ, например дефис -
. Например, все атрибуты, указанные в файле forms.py
, указанном в вопросе, доступны в шаблоне Django, как показано ниже
<!-- Django 2.2.9 template file -->
<p>0. {{form.email}}</p>
<p>1. {{form.email.field.label}}</p>
<p>2. {{form.email.field.max_length}}</p>
<p>3. {{form.email.field.widget.attrs.class}}</p>
<p>4. {{form.email.field.widget.attrs.placeholder}}</p>
На изображении ниже показано отображение в веб-браузере.
Однако доступ к атрибуту aria-describedby
более сложен, так как используется дефис, специальный символ. Решение состоит в том, чтобы написать собственный шаблонный фильтр, например, с именем get_key_value
, и в шаблоне вызвать фильтр, используя символ канала, например {{form.email.field.widget.attrs|get_key_value:"aria-describedby"}}
Пользовательский шаблонный фильтр
Здесь мой план написания настраиваемого фильтра шаблонов, в основном на основе Django документации :
a. Добавить папку в каталог приложения с именем templatetags
и в этой папке добавьте два файла, пустой файл с именем __init__.py
и файл с именем myapp_extras.py
.
b. Добавьте следующий код в myapp_extras.py
.
# Django 2.2.9
from django import template
register = template.Library()
@register.filter(name="get_key_value")
def get_key_value(some_dict,key):
return some_dict.get(key,'')
c. В settings.py
добавить фильтр в список установленных приложений. Обратите внимание, я назвал свое приложение myapp
, также добавленное в список.
# Django 2.2.9
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
'myapp.templatetags.myapp_extras'
]
D. Загрузите пользовательские фильтры в шаблон и примените фильтр get_key_value
<!-- Django 2.2.9 template file -->
{% load myapp_extras %}
<p>0. {{form.email}}</p>
<p>1. {{form.email.field.label}}</p>
<p>2. {{form.email.field.max_length}}</p>
<p>3. {{form.email.field.widget.attrs.class}}</p>
<p>4. {{form.email.field.widget.attrs.placeholder}}</p>
<p>5. {{form.email.field.widget.attrs|get_key_value:"aria-describedby"}}</p>
В браузере это выглядит так, как показано ниже, обратите внимание на пункт 5, где значение ключа aria-describedby
отображается как EmailHelp
.