2

我一直在查看文档,并认为内联表单集可能是答案。但我并不完全确定。

通常,每当您创建 ModelForm 时,它只会绑定到相关的模型。但是,如果您想在一个表单中编辑两个模型怎么办?

简而言之,在编辑 classconversation并从下拉列表中选择一个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)

更新

我不确定 inline-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下拉菜单根本没有列出。为什么?

4

2 回答 2

2

我找到了解决方案,并希望这将有助于将来遇到同样问题的其他人。我最终重新设计了我的模型。

我只是将状态也添加到了我的对话模型中。

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()  

这很好用。

于 2012-07-17T09:35:48.027 回答
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)
于 2012-11-28T02:55:11.633 回答