У меня есть клиент, у которого есть существующий шаблон формы Django, визуализированный из представления, которое просто расширяет UpdateView. В существующем шаблоне {{ form.as_p }}
используется для визуализации довольно общей c формы, т.е. элементов ввода, элемента select и input type = "submit". Элемент select - это то, что отображается для ManyToManyField модели, чтобы разрешить выбор нескольких значений.
Клиенту требуется автозаполнение ввода Ajax -style вместо элемента select. Однако API вообще не существует. Архитектура - это просто рендеринг формы, а затем форма POST.
Я заменил {{ form.as_p }}
на {{ form.xxx }}
, чтобы отобразить каждый из элементов ввода. И вместо элемента select я написал несколько пользовательских Javascript и макет для управления всеми функциями автозаполнения. Этот код поддерживает массив выбранных пользователем значений из всех возможностей. Но я не уверен, как действовать с помощью Javascript, чтобы получить форму для отправки с правильной полезной нагрузкой.
Если бы это был ajax стиль отправки, я бы serialize()
форму и затем добавьте мои пользовательские значения и затем отправьте POST в API с сериализованной полезной нагрузкой.
Я мог бы добавить скрытое выделение и затем изменять его в DOM при каждом изменении настраиваемых полей, а затем вызывать что-то вроде jQuery s submit()
. Но это кажется мне довольно не элегантным, поэтому я ищу другие варианты.
models.py
class Tag(models.Model):
name = models.CharField(max_length=63)
class Notebook(models.Model):
title = models.CharField(max_length=200)
tags = models.ManyToManyField(Tag, related_name='notebook')
views.py
class NotebookUpdateView(UpdateView):
model = Notebook
template_name = 'notebook_edit.html'
fields = '__all__'
Обновление
Я добавил <select hidden id="id_tags" multiple></select>
и при отправке вставляю теги, которые были выбраны в качестве <option>
элементов (потомков <select>
). Это работает, хотя остальной проблемой является добавление совершенно новых тегов, поскольку Django использует идентификатор тега для атрибутов выбора значения и отклоняет любой элемент <option>
, который не является допустимым идентификатором тега.