2011-07-26 19 views
0

でフォームをモデル化するために、外部キーの子供たちを追加します。私は、次のDjangoのモデルを持っているジャンゴ

class Contact(models.Model): 
    id #primary key 
    #Other contact info 

class ContactType(models.Model): 
    contacttype_choices=(('Primary', 'Primary'), 
         ('Billing', 'Billing'), 
         ('Business', 'Business'), 
         ('Technology', 'Technology')) 
    contact=models.ForeignKey(Contact) 
    type=models.CharField(choices=contacttype_choices, max_length=30) 
    class Meta: 
     unique_together=('contact', 'type') 

だから、任意の連絡先オブジェクトは、それぞれのタイプが存在するか不在であることのいずれかで、最大4つの接点タイプを持つことができます。私はContactのモデルフォームを連絡先タイプの複数選択欄にしたいと考えています。 ContactインスタンスでContactフォームを作成すると、このContact Typeフィールドに既存の値を設定するにはどうすればよいですか?

編集:明確にするために、私は1つのチェックボックスは、これらの4つの選択肢ごとに作成することにしたい、とフォームはモデルインスタンスをインスタンス化されている場合、私はチェックボックスが関連するオブジェクトごとにチェックすることにしたいですフィールドの残りの部分と自動的に何が起こるかに似ています。

+0

この文章は完成しましたか? ... "だから、どんな連絡先オブジェクトでも、連絡先の種類を増やすことができます。" – jcfollower

+0

ありがとう、私はそれを逃した。私は今それを修正した。 – murgatroid99

+0

これはあなたを助けますか? [Djangoの複数選択フィールド](http://stackoverflow.com/questions/2726476/django-multiple-choice-field-checkbox-select-multiple) – jcfollower

答えて

1

私はおそらくモデルをそのように構成していますので、連絡先の作成/編集時にどの連絡先タイプを選択できるのですか。 ContactTypeがManyToManyとして関連付けられている場合、ModelFormにModelMultpleChoiceFieldが自動的に取得されます。必要なのは、CheckboxSelectMultipleウィジェットを使用して、探している出力を取得するだけです。

ContactのインスタンスをContactFormに渡すと、Djangoは事前に選択されたContactTypeの選択肢をバインドし、私たちのチェックボックスをチェックします。

各ContactTypeのタイトルを一意に設定することは、contactとcontact_typeのunique_togetherと同じです。

#models.py 
class Contact(models.Model): 
    #other fields 
    contact_types = models.ManyToMany(ContactType) 

class ContactType(models.Model): 
    title = models.CharField(max_length=20, unique=true) 

#forms.py 
class ContactForm(forms.ModelForm): 
    class Meta: 
     model = Contact 

    def __init__(self, *args, **kwargs): 
     super(ContactForm, self).__init__(*args, **kwargs) 
     self.fields['contact_types'].widget = forms.CheckboxSelectMultiple() 
+0

私の問題は、選択肢を作成すること(またはモデルとビューの間でそれらを複製すること)ではありません。私の問題は、モデル・フォームがモデル・インスタンスでインスタンス化されると、フォーム・フィールドにそのインスタンスの値があらかじめ設定されているため、モデルの一部ではない追加のフィールドにその動作を複製したいということです。 – murgatroid99

+0

私はモデルの現在の状態を考えて、あなたが望むことをすることはできないと思うので、私は自分の答えを修正しようと思います。 – Brandon

+0

はい、@ waffleの例はうまくいきますが、連絡先への外部キーを持つContactTypeがその情報をモデル化する最良の方法だとは思われません。私の$ 0.02。 – Brandon

1

あなたはこれを試しましたか?

class ContactForm(forms.ModelForm): 
    class Meta: 
     model = Contact 
    def __init__(self, *args, **kwargs): 
     super(ContactForm, self).__init__(*args, **kwargs) 
     self.fields['contacttypes'] = forms.MultipleChoiceField(
      choices = CONTACT_TYPE_CHOICES, 
      label = "contact type", 
      widget = CheckBoxSelectMultiple 
     ) 

contact = Contact.objects.get(pk=1) # or whatever 
types = ContactType.objects.filter(contact = contact) 
form = ContactForm(instance=contact, initial={'contacttypes' : types}) 
+0

これは成功しました。ただし、イニシャライザ内に追加のフィールドを定義する必要はなく、 '.values_list( 'type'、flat = True)'を2番目のクエリの最後に追加しました。 「イニシャル」のドキュメントでは、「特定の価値が提供されていない場合はフォールバックの値として使用されていない」と言われており、誤解していたので、これはうまくいくとは思わなかった。 – murgatroid99

+0

上記で挙げた理由にかかわらず、initの選択肢でフィールドを定義することをお勧めします。今回は明確な定義がなくてもうまくいくかもしれませんが、私はあなたがその行動に頼るべきではないと思います。 –

関連する問題