Django: назначьте ключ доступа для метки вместо выбора

Я разрабатываю сайт, который должен быть максимально доступным. При назначении ключей доступа к полям моей формы с помощью widget=FieldWidget(attrs={'accesskey':'A'}) я обнаружил, что валидатор w3c не будет проверять строгую страницу xhtml с ключом доступа в теге выбора. Во всяком случае, я не смог найти способ назначить ключ доступа метке, связанной с полем выбора (правильный способ сделать выбор доступным). Есть ли способ сделать это?

Спасибо


person Mirko Rossini    schedule 08.01.2010    source источник


Ответы (1)


Интересный вопрос. HTML 4.01 также запрещает accesskey в select.

Я считаю, что короткий ответ: не в стандартном Django.

Намного более длинный ответ: я просмотрел код в django/forms/fields.py и .../widgets.py, и метка обрабатывается строго как строка (принудительно smart_unicode()). На ум приходят четыре возможных решения, первые три не очень хороши:

  1. Игнорируйте ошибку проверки. Я ненавижу это делать, но иногда это необходимый кладж. Большинство браузеров намного свободнее, чем DTD, в том, что они позволяют. Если вы можете заставить ключ доступа работать, даже если технически он находится не в том месте, это может быть самым простым способом.

  2. Перехватите вывод шаблона и выполните какой-нибудь уродливый поиск и замену. (Блех!)

  3. Добавьте новую функциональность в код виджетов/форм, MonkeyPatching. MonkeyPatch django.forms.fields.Field для перехвата и сохранения нового аргумента (label_attrs?). MonkeyPatch метод label_tag() для forms.forms.BoundField для работы с новым значением widget.label_attrs.

    Я намеренно не буду подробно рассказывать об этом. Если вы понимаете код достаточно хорошо, чтобы MonkeyPatch его, то вы достаточно умны, чтобы знать об опасностях, связанных с этим.

  4. Внесите те же функциональные изменения, что и в пункте 3, но сделайте это как представленный патч для базы кода Django. Это лучший долгосрочный ответ для всех, но это также и большая часть работы для вас.

Обновление: ссылка Йони Самлана на настраиваемый фильтр (http://www.djangosnippets.org/snippets/693/) работает, если вы создаете тег <label> самостоятельно. Мои ответы направлены на то, чтобы по-прежнему использовать всю мощь Форм, но попытаться настроить результирующий <label>.

person Peter Rowell    schedule 08.01.2010
comment
Спасибо, этот фрагмент именно то, что я искал! - person Mirko Rossini; 13.01.2010