2010-03-23 57 views
3

我有兩個型號:Django的形式由許多連接2種型號衆多領域

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 

該表格包括名稱和事件,允許我創建一個新的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適用於另一組模型,但這是一個不同的例子。我想我完全錯了。

總體問題:如何創建一個表單,允許我創建一個新的事件並將其鏈接到現有的Actor?

+0

'Event'中涉及多少個'Actor'?從我的感覺來看,我首先會創建一個從'Event'到'Actor'的外鍵。 – 2010-03-23 20:24:29

+1

我明白你的觀點,但我認爲多對多是正確的。不止一個演員可以參加一個活動,而演員可以參加多個活動。 – 2010-03-23 22:06:15

回答

1

就個人而言,我會把多對多的事件來開始的,但每一個自己...

至於如何做到這一點,你會想編寫一個自定義的ModelForm(沒有內嵌的formset ),我們稱之爲EventForm。它可以處理所有事件的字段,並且還會有一個ModelChoiceFieldModelMultipleChoiceField以允許選擇涉及的Actor。然後在您的視圖中,您將拆分事件字段和ForeignKey/M2M字段的處理。

有意義嗎? alt text http://sonicloft.net/im/52