2015-11-18 156 views
0

我想在一種形式中使用兩種模型。模型有很多關係,那麼最好的解決方案是什麼?我嘗試了formset,但我只看到一個模型的字段,而不是兩個字段。一種形式的多個模型

我的模型:

class Event(models.Model): 
    title = models.CharField(max_length=100) 
    description = models.TextField(max_length=400) 
    location = models.CharField(max_length=100) 

class EventTime(models.Model): 
    start_time = models.DateTimeField() 
    event = models.ManyToManyField(Event) 

回答

3

定義模型形式爲每個表單。

class EventForm(forms.ModelForm): 
    class Meta: 
     fields = ('title', 'description', 'location') 

class EventTimeForm(forms.ModelForm): 
    class Meta: 
     fields = ('start_time',) 

注意,event領域已經被排除在外,因爲我們希望將事件時間對象鏈接到我們正在創造新的事件。

在您看來,您需要將兩個表單都傳遞給模板上下文。採用多種形式時,使用前綴是一個好主意,它可以防止在request.POST

event_form = EventForm(prefix="event") 
event_time_form = EventTimeForm(prefix="eventtime") 

衝突在模板字段名稱,您可以在同一個表單標籤多種形式。

<form method="post"> 
    {{ event_form }} 
    {{ event_time_form }} 
</form> 

處理POST請求時,請檢查兩個表單是否有效。保存兩個表單後,您可以將事件和事件時間鏈接在一起。

event_form = EventForm(request.POST, prefix="event") 
event_time_form = EventTimeForm(request.POST, prefix="eventtime") 

if event_form.is_valid() and event_time_form.is_valid(): 
    event = event_form.save() 
    event_time = event_time_form.save() 
    event_time.event.add(event) 
+0

前綴非常好,但有一個陷阱:如果您想在表單有效時訪問字段值,請從名稱字段中刪除前綴;例如'if event_form.is_valid():thetitle = event_form.cleaned_data ['title']' –