django форма с выпадающим списком

Поле множественного выбора с автодополнением в Django

Привет, хабр.
В прошлой своей статье я описал технологию создания кастомного поля для ввода тегов в Django. Сейчас я бы хотел поделиться готовым и более-менее универсальным решением, реализующим поле множественного выбора с автодополнением по AJAX. Отличие этого поля от описанного в предыдущей статье в том, что оно позволяет только выбирать элементы из справочника, но не создавать новые. За front-end часть будет отвечать замечательный jQuery-плагин Select2. Решение будет оформлено в виде отдельного приложения Django.

Виджет

Конструктор виджета принимает класс модели, флаги multiple и disabled, отвечающие, соответственно, за множественность выбора и активность поля. В субклассе Media подключаются скрипты и стили Select2. Скрипт, инициализирующий плагин Select2, будет описан в шаблоне infinite_choice_widget.html.

Представление для работы автодополнения

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

Функция django.db.models.get_model фозвращает класс модели. Далее, в зависимости от переменных запроса, из модели выбираются либо варианты, начинающиеся со строки term, либо варианты, имеющие id равные переданным в переменной ids. Второй случай происходит при инициализации плагина с уже введенными ранее данными.
Я добавил в response заголовок Cache-Control, с временем жизни данных в кэше — сутки. Это чтоб не дергать базу однотипными запросами. Очень помогает при использовании поля с огромными справочниками типа КЛАДР/ФИАС.

А так выглядит запись в urls.py для нашей вьюхи.

Поле формы

Как известно, поле формы в django служит, в основном, для валидации введенных в него данных. Наш класс поля будет выглядеть следующим образом:

Я не стал наследоваться от ModelMultipleChoiceField, так как оно работает с queryset, а нам надо работать с моделью.
Конструктор инициализирует виджет переданными моделью, флагами multiple и disabled и специфичными аттрибутами.
Метод to_python получает в качестве value либо одиночный id, либо несколько id в одной строке через запятую и обрабатывает его в зависимости от флага multiple. В обоих случаях проверяется наличие выбранных id в модели.
Метод prepare_value подготавливает инициализирующие данные для отображения: если в параметре initial поля передан одиночный инстанс модели, то возвращает id этого инстанса в виде строки; если же передан список инстансов или QuerySet, то возвращает строку с id через запятую.

Заключение

Поле готово к употреблению. Приложение можно скачать здесь. Пользоваться полем очень легко:

, где ChoiceModel — произвольная модель вида

Осталось не забыть подключить приложение в settings.py,

и вывести статику формы TestForm в шаблоне

Источник

Django. Выпадающий список в форме

Имеется модель Post с полем «category». В модели есть несколько объектов с разными значениями этого поля (‘url’, ‘file’, ‘video’). Как при создании объекта через форму сделать выпадающий список для этого поля, чтобы можно было либо выбрать одно значение из существующих (отсеив дубликаты), либо вписать новое значение? Пробую сделать через

но в выпадающем списке вываливается всё в виде словарей:

По сути надо, избавиться от ключей, оставив только значения. Ну и плюс нужно добавить возможность вместо только выбора существующего вписать/создать новую категорию.

1 ответ 1

Список уникальных значений можно получить так:

Но, если нужно уметь редактировать эти категории, то лучше сделать отдельную модель Category и привязать её к Post как ForeignKey

r8X5i

Всё ещё ищете ответ? Посмотрите другие вопросы с метками django или задайте свой вопрос.

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.11.5.40661

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • django форма регистрации пользователей
  • django форма значение по умолчанию