Замена <select>в Django формы с пользовательской логикой - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть клиент, у которого есть существующий шаблон формы 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>, который не является допустимым идентификатором тега.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...