2012-07-16 70 views
0

我一直在看文檔,並認爲也許內聯formset將是答案。但我不完全確定。在Django中的表單中的表單?

通常,只要您創建一個ModelForm,它就只會綁定到相關的Model。但是如果你想在表單中編輯兩個模型呢?

簡而言之,當編輯類conversation,並從下拉列表中選擇Deal類時,我希望能夠更改所選交易類的狀態(但不是deal_name)。全部在相同的形式。 Django允許嗎?

class Deal(models.Model):  
    deal_name   = models.CharField() 
    status    = models.ForeignKey(DealStatus) 

class Conversation(models.Model): 
    subject    = models.CharField() 
    deal    = models.ForeignKey(Deal, blank=True, null=True) 

更新

我不知道,如果直列formssets的答案是以下行爲的原因:

查看:

call = get_object_or_404(contact.conversation_set.all(), pk=call_id) 
ConversationFormSet = inlineformset_factory(Deal, Conversation) 
fset = ConversationFormSet(instance=call)  
variables = RequestContext(request, {'formset':fset}) 
return render_to_response('conversation.html', variables) 

模板

{{ formset }} 

我得到的結果不是我所期望的。我收到了三種形式的對話課程,第一個填寫了(由於編輯和傳遞)。但是,Deal DropDown菜單根本沒有列出。爲什麼?

+0

這正是內聯是 – 2012-07-16 11:43:26

+0

@ArgsKwargs感謝。我已經更新了這個問題,如果你可以看一看。 – Houman 2012-07-16 12:12:10

+0

由於內聯方式的工作,他們期望內聯始終是您正在編輯的交易對象的一部分,如果您想以其他方式工作,則需要另一種方法,您可以在交易字段中進行破解並創建自定義如果交易字段輸入與主對象不一致,則將會話對象移動到另一筆交易 – 2012-07-16 12:20:18

回答

0

我找到了解決方案,並希望這將有助於未來同樣的問題的其他人。我最終重新設計了我的模型。

我只是將狀態添加到我的對話模型。

class Conversation(models.Model): 
    subject    = models.CharField() 
    deal    = models.ForeignKey(Deal, blank=True, null=True) 
    status    = models.ForeignKey(DealStatus) 

在視圖中我添加了一個自定義保存這樣的:

if form.is_valid():    
      call = form.save(commit=False) 
      deal = get_object_or_404(Deal.objects.all(), pk=call.deal.id) 
      deal.status = call.status 
      deal.save() 
      call.save() 

這很好地工作。

2

另一種方法是使用信號是這樣的:

def update_deal_status(sender, instance, created, **kwargs): 
    if created: 
     deal = Deal.objects.get(id__exact=instance.deal_id) 
     deal.status = instance.status 
     deal.save() 

signals.post_save.connect(update_deal_status, sender=Conversation)