2016-10-07 2 views
1

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

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. Кнопка A +, чтобы создать/показать новую форму, чтобы повторить процесс, поэтому я может выбрать новую услугу и соответствующие мониторы.

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

ответ

0

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

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

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

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

+0

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

Смежные вопросы