Django: динамические встроенные формы с фильтром при выборе пользователя

#python #django #forms #inline-formset

#python #django #формы #встроенный-набор форм

Вопрос:

Я создал эти модели:

 class Service(models.Model):
    name = models.CharField(blank=False, max_length=200)code here

class Monitor(models.Model):
    name = models.CharField(blank=False, max_length=100)
    services = models.ManyToManyField(Service, related_name='monitors')

class Student(models.Model):
    name = models.CharField(blank=False, max_length=100)

class ServiceMonitors(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    service = models.ForeignKey(Service, on_delete=models.CASCADE)
    monitors = models.ManyToManyField(Monitor)
  

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

Предположим, что у нас есть 3 службы: s1, s2 и s3. Когда мы создаем новый монитор, мы назначаем ему / ей некоторые из этих сервисов, скажем, s1 и s3. Затем, когда мы создаем нового ученика, мы должны иметь возможность выбирать, какие сервисы и мониторы будут у ученика.

Моя проблема здесь в том, что мне нужна форма для создания ученика (имя, телефон и т. Д.), Которая позволяет мне:

  1. Выберите службу из выпадающего списка элементов управления
  2. После выбора службы в форме должны отображаться мониторы, предлагающие эту услугу, чтобы я мог выбрать один или несколько из них (флажки).
  3. Кнопка для создания / отображения новой формы для повторения процесса, чтобы я мог выбрать новую службу и связанные мониторы.

Я очень новичок в Django. Мне удалось создать встроенную форму в форме создания пользователя, но я застрял здесь. Теперь у меня есть выпадающий элемент управления для выбора службы и ModelMultipleChoiceField с виджетом CheckboxSelectMultiple, который показывает все мониторы. Отсюда мне нужно знать, как фильтровать эти мониторы, когда пользователь выбирает сервис, и как добавлять новые формы для выбора новых сервисов / мониторов.

Ответ №1:

Вероятно, этим нельзя управлять в рамках Django forms, функциональность которой очень ограничена. Это позволяет вам использовать отфильтрованный набор запросов для выбора в ModelChoiceDropDown (я думаю, это название), но фильтрация после выбора таким образом невозможна. Формы Django генерируются и отправляются в виде HTML, который невозможно отфильтровать без многих изменений.

Способ, которым вы, вероятно, сделали бы это, — настроить интерфейс REST (см. Django Rest Framework или Django-Tastypie) и связать свои выпадающие списки с этим, используя интерфейс по вашему выбору (я предпочитаю Backbone.js , но есть много вариантов). Идея заключается в том, что после выбора службы последующие выпадающие списки добавят фильтр к своим запросам, чтобы показывать только мониторы, которые предлагают эту услугу.

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

Это довольно большая кроличья нора, и у меня нет никаких ресурсов, на которые можно было бы указать. Но чтение об интерфейсах REST — хорошее начало.

Комментарии:

1. Спасибо, Дон, я думаю, я попробую это с пользовательскими формами и некоторыми JS. Попытается отобразить все службы в виде флажков и показать связанные мониторы, когда пользователь выбирает службу. Таким образом, я могу отправить всю отфильтрованную информацию на сторону клиента.