Форма Django, связывающая две модели от многих ко многим - PullRequest
3 голосов
/ 23 марта 2010

У меня есть две модели:

 class Actor(models.Model):
     name = models.CharField(max_length=30, unique = True)
     event = models.ManyToManyField(Event, blank=True, null=True)

 class Event(models.Model):
     name = models.CharField(max_length=30, unique = True)
     long_description = models.TextField(blank=True, null=True)

Я хочу создать форму, которая позволит мне определить связь между двумя моделями при добавлении новой записи. Это работает:

 class ActorForm(forms.ModelForm):
     class Meta:
           model = Actor

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

С обратной стороны,

 class EventForm(forms.ModelForm):
     class Meta:
           model = Event

Эта форма не включает актерскую ассоциацию. Так что я могу создать только новое событие. Я не могу одновременно связать его с существующим актером.

Я пытался создать встроенный набор форм:

 EventFormSet = forms.models.inlineformset_factory(Event,
       Actor,
       can_delete = False,
       extra = 2,
       form = ActorForm)

но я получаю ошибку

<'class ctg.dtb.models.Actor'> has no ForeignKey to <'class ctg.dtb.models.Event'>

Это не так уж удивительно. Inlineformset работал для другого набора моделей, которые у меня были, но это другой пример. Я думаю, что я делаю это совершенно неправильно.

Общий вопрос: Как я могу создать форму, которая позволит мне создать новое событие и связать его с существующим актером?

1 Ответ

1 голос
/ 24 марта 2010

Лично я бы для начала поместил ManyToMany в Event, но каждому своё ...

Что касается того, как это сделать, вы хотите написать собственный ModelForm (не встроенный набор форм), назовем его EventForm. Он будет обрабатывать все поля вашего события, а также иметь ModelChoiceField или ModelMultipleChoiceField , чтобы разрешить выбор задействованных актеров. Затем, на ваш взгляд, вы разделите обработку полей Event и поля ForeignKey / M2M.

Имеет смысл? альтернативный текст http://sonicloft.net/im/52

...