2017-12-04 22 views
1

私は、ユーザーが1つのSubmitボタンをクリックして送信する4つのフォームを持っています。形式は以下のとおりです。私のビューからdjango汎用外部キーを設定するにはどうすればよいですか?

  1. Person Form - 人モデルへ
  2. Address Formを救う - モデル
  3. Phone Formにメールで知らせるために保存します - - Phoneモデルに保存したいモデル
  4. Email Formに対処するために保存します。

ので、Personは、複数のAddressesEmailsPhone番号を持つことができます。だから、私は人のモデルでこれをやった:

class Person(models.Model): 
    first_name = models.CharField(max_length=99) 
    middle_name = models.CharField(max_length=99, blank=True, null=True) 
    last_name = models.CharField(max_length=99, blank=True, null=True) 
    address = GenericRelation('Address') 
    phone = GenericRelation('Phone') 
    email = GenericRelation('Email') 

は、私は今、私はこれらにデータを保存する方法AddressPhoneEmail

content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) 
object_id = models.PositiveIntegerField() 
content_object = GenericForeignKey('content_type', 'object_id') 

ため、それぞれのモデルフィールドと一緒にこれらの3行を持っていますユーザーからフォームを受け取ったとき、私の見解で正しくモデル化されていますか?これまで私が持っていたこと。

if request.method == 'POST': 
     if person_form.is_valid() and address_form.is_valid() and email_form.is_valid() \ 
       and phone_form.is_valid(): 

      address = address_form.save() 
      email = email_form.save() 
      phone = phone_form.save() 

      person = person_form.save(commit=False) #This person model has a generic foreign key relation with Address, Email and Phone 
      person.address = (address) #This is where I need help. Am I thinking right? Is this the right way to save? 

答えて

1

あなたは、私は、コードを変更した、GFKが定義されているモデルでは、コンテンツオブジェクトを設定する必要が 、

if request.method == 'POST': 
       if person_form.is_valid() and address_form.is_valid() and email_form.is_valid() \ 
         and phone_form.is_valid(): 

       person = person_form.save() 

       address = address_form.save(commit=False) 
       address.content_object = person 
       address.save() 
       email = email_form.save(commit=False) 
       email.content_object = person 
       email.save() 
       phone = phone_form.save(commit=False) 
       phone.content_object = person 
       phone.save() 

しかし、私は1つの重大な疑問がありますか?なぜあなたのモデルで汎用外部キーを使用していますか?これらのモデルは、Person以外の他のモデルを参照できますか。

+0

はい、複数のモデルを参照します。これはPersonモデルです。アカウント、連絡先などあります。本当にありがとうございました。 – DeA

関連する問題