2

私はドキュメントを見ていて、おそらくインラインフォームセットが答えになるだろうと思いました。しかし、私は完全にはわかりません。

通常、ModelFormを作成するときは常に、関連するモデルにのみバインドされます。しかし、フォーム内の2つのモデルを編集したい場合はどうでしょうか。

簡単に言うと、クラスを編集し、ドロップダウンからクラス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)

更新

インラインフォームセットが答えであるかどうかわからなかった理由は、次の動作です。

意見:

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 }}  

私が得ている結果は、私が期待したものではありません。私は3つの形式の会話クラスを取得しています。最初のクラスが入力されています(編集とインスタンスの受け渡しによる)。ただし、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 に答える