Учитывая следующие модели (вырублено для понимания):
class Venue(models.Model):
name = models.CharField(unique=True)
class Band(models.Model):
name = models.CharField(unique=True)
class Event(models.Model):
name = models.CharField(max_length=50, unique=True)
bands = models.ManyToManyField(Band)
venue = models.ForeignKey(Venue)
start = models.DateField()
end = models.DateField()
Область администратора отлично подходит для того, что я делаю, но я бы хотел немного открыть сайт, чтобы некоторые пользователи могли добавлять новые события. Для публичных частей у меня есть несколько «административных» полей в этих моделях, которые я не хочу, чтобы публика видела (что достаточно легко исправить).
Моя конкретная проблема, однако, заключается в изменении отображения выбора ManyToMany при создании нового события. Поскольку количество полос, которые можно перечислить для события, не следует отправлять в виде поля множественного выбора, я хотел бы использовать автозаполнение, которое обрабатывает кратные значения (например, поле «Теги» в StackOverflow!).
У меня эта часть работает , и она правильно заполняет скрытый ввод с Band.id, разделенным запятыми для значения. Однако , я не могу понять, как собрать Django для проверки, используя ModelForms , и каким-то образом также проверить выбор 'Bands'.
В идеале я хочу выполнить автоматическое заполнение, как теги здесь, в StackOverflow, и отправлять выбранные идентификаторы полос в виде какой-либо строки с разделителями - все это, позволяя Django проверять существование пропущенных полос и т. Д., Как если бы я оставил Раздражающий список множественного выбора на месте.
Нужно ли создавать собственный тип поля автозаполнения для формы или модели и использовать его? Есть ли что-то еще, что я пропускаю?
Я видел некоторые существующие виджеты автозаполнения, но я действительно очень хочу использовать свой собственный код автозаполнения, поскольку он уже настроен, и некоторые из них выглядят немного запутанными.
Здесь было намного больше текста / объяснений, но я сократил, потому что я избегаю Wall Of Text. Если я пропустил важные вещи, дайте мне знать.