Django: назначить ключ доступа вместо метки - PullRequest
1 голос
/ 08 января 2010

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

Спасибо

1 Ответ

1 голос
/ 08 января 2010

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

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

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

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

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

  3. Добавление новых функций в код виджетов / форм с помощью MonkeyPatching it. 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>.

...