2015-07-26 5 views
0

у меня есть две модели Django, связанные со связью ManyToMany через «сквозную» модели:Показать все варианты в Django ManyToMany форме

class Tag(Model): 
    uuid = UUIDField(auto=True, version=4, primary_key=True) 
    name = CharField(max_length=100) 

class Agent(Model): 
    uuid = UUIDField(auto=True, version=4, primary_key=True) 
    tags = ManyToManyField(
     'Tag', blank=True, null=True, through='AgentTag') 

class AgentTag(Model): 
    agent = ForeignKey(Agent) 
    tag = ForeignKey(Tag) 
    experience = IntegerField() 

я хотел бы создать форму, показывая все теги в модели Tag , наряду с раскрывающимися списками для агента, чтобы записать свой опыт в каждом теге. Если пользователь ранее обновил свой опыт, форма должна быть инициализирована этим. Сохранение формы должно обновлять таблицу «через» AgentTag.

Какой тип формы (или формы?) Необходим для этого? Я не уверен, должен ли он быть ModelForm для AgentTag или заказной формы. Очень ценю некоторую помощь в том, как подойти к этому.

ответ

0

Форма FormSet здесь не нужна, но может быть, я просто не привык к использованию форм.

Я бы сказал, что на ваш взгляд, вы могли бы просто:

  1. Получить список всех существующих Tag с.
  2. Получить AgentTag для каждого из Tag s, создать, если отсутствует [0]. Для тех, которые уже существуют, у вас будет опыт, предварительно заполненный их формами.
  3. Итерация свыше AgentTag s, инициализация ModelFormс уникальным prefix для каждого.

Когда форма отправлена, ваше представление будет проходить через доступную AgentTag s, построить форму для каждого на основе данных POSTed и сохранить полученные объекты.

Вы также можете рассмотреть возможность обновления опыта с помощью запросов async HTTP (AJAX) со своей клиентской стороны всякий раз, когда пользователь изменяет раскрывающееся меню, но это будет несколько более сложным, хотя в то же время вы можете уклониться от форм.

[0] На самом деле, в зависимости от ваших потребностей, вы, кажется, может создать AgentTag экземпляр для каждого Tag как только новый Agent сохраняется (с пустым AgentTag.experience, который вы должны сделать обнуляемым), но это не действительно важно.

+0

Спасибо! Это имеет смысл. Есть 215 тегов (мы показываем/скрываем разные разделы из них Javascript), поэтому создание экземпляров, которые многие формы как на GET, так и на POST, похоже на работу с сервером. Я соблазн просто добавить текущее состояние структуры данных в контекст, вручную выставить флажки, а затем обновить модель из ответа POST, полностью обходя формы Django. Дайте мне знать, если вы считаете, что это плохая идея. – user3700505

+0

Хотя я не думаю, что создание форм 215 обязательно является большой проблемой (если вы избегаете делать какие-либо запросы БД в цикле), определенно имеет смысл полностью отказаться от форм, если вам нужно показать только один селектор для каждого тега. Это также облегчит настройку селектора - не нужно погружаться в виджеты форм и прочее. – Tony

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