Создание модели Django-Nonrel ManyToOne на лету - PullRequest
2 голосов
/ 04 июня 2011

У меня есть 3 модели: Компания, Проект и Контакт с соответствующими отношениями:

Company-Project (M2M) 
Project-Contact (M2M) 
Company-Contact (OneToMany)

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

Мне удалось перенести кнопку создания динамической модели Django Admin (тот маленький зеленый плюс) для полей M2M. Таким образом, пока создается компания, пользователь может щелкнуть зеленое поле «плюс» рядом с проектами, появится всплывающее окно и позволит ему создать экземпляр проекта. Когда он нажимает «Отправить» во всплывающем окне, оно закрывается, и окно проекта исходной формы обновляется новыми данными проекта.

Для отношений OneToMany обычно пользователь выбирает часть отношения «Один» при создании модели, которая стоит на стороне «Многие» с помощью комбинированного окна, и это можно сделать, если вы создадите модель контакта. а затем выберите предварительно созданный экземпляр компании в ContactForm.

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

Единственное решение, которое я мог придумать, - это добавить в контакт поле temp_uuid, чтобы при создании нового экземпляра CompanyForm ему назначался uuid, а затем каждый раз, когда пользователь нажимал на зеленый плюс, создавал a Контакт, он назначит uuid формы в поле temp_uuid Контакта (мы можем назвать это псевдо-внешним ключом, нет?). Так что после создания я смогу заполнить поле формы контактами для этой компании, хотя компания еще не была создана. И когда форма будет отправлена, я назначу ПК для внешнего ключа каждого контакта и сохраню их.

Могу поспорить, есть лучший способ сделать это. Кроме того, проекты выполняются на App Engine и используют django-nonrel, поэтому о любом использовании JOIN не может быть и речи.

...