2017-07-20 9 views
0

インスタンスを渡し:ジャンゴModelFormサブクラスの継承、サブクラスと私はアドレスモデル持って

class Address(models.Model): 
    line1 = models.CharField(max_length=100) 
    .... 

とAddressForm:

class AddressForm(forms.ModelForm): 
    class Meta: 
    model = Address 

いくつかのモデルは、アドレスフィールドを持つことになりますが、その代わりに、コピーの+ AddressFormのすべてのフィールドを貼り付けると、再利用できるようにAddressFormを拡張したかったのです。具体的には、すべてのフォームフィールドを他のアプリケーションのフォームに貼り付けてコピーし、AddressForm.is_valid()関数を1つしか持たないようにします。私の計画は、このような何かをすることだったので、

例えば、注文は、アドレスを持っています:私はorder/views.pyからOrderFormにインスタンスを渡すとき

class Order: 
    address = models.ForeignKey(Address, on_delete=models.CASCADE) 

class OrderForm(AddressForm): 
    class Meta: 
    model = Order 

をしかし、私はインスタンスを渡しています注文とAddressFormフィールドのすべての空白として表示:

form = OrderForm(instance=order) 

がどのように私はorder.addressフィールドからAddressFormのフィールドを初期化しますか?

class OrderForm(AddressForm): 
    def __init__(self, *args, **kwargs): 
     kwargs['instance'] = kwargs['instance'].address 
     super(OrderForm, self).__init__(*args, **kwargs) 

をしかし、それは動作しません:

私はこれを試してみました。

これを行う方法はありますか?または、AddressFormを再利用するより良い方法は?または、これはOrderがAddressのサブクラスだった場合にのみ機能しますか?

乾杯、

答えて

2

あなたが住所をサブクラス化したくない場合は、あなたの代わりに注文フォームのアドレスフィールドを含むしようとしているのビューに2つのフォームを使用する必要があります。

if request.method = "POST": 
    address_form = AddressForm(request.POST, instance=order.address) 
    order_form = OrderForm(request.POST, instance=order) 
    if address_form.is_valid() and order_form.is_valid(): 
     address = address_form.save() 
     order = order_form.save() 

ご注文フォームでは、外部キーをAddressに含めないでください。

class OrderForm(AddressForm): 
    class Meta: 
    model = Order 
    exclude = ['address'] 

新しいインスタンスを作成するとき、あなたは、commit=Falseで注文フォームを保存するアドレスを設定し、順番保存してください:

if request.method = "POST": 
    address_form = AddressForm(request.POST) 
    order_form = OrderForm(request.POST) 
    if address_form.is_valid() and order_form.is_valid(): 
     address = address_form.save() 
     order = order_form.save(commit=False) 
     order.address = address 
     order.save() 
+0

驚くばかりの、それは素晴らしいソリューションです。乾杯! –

関連する問題