26

ModelMultipleChoiceFieldは最初の選択肢を選択せず​​、私の例では次の修正(以下のリンク)を機能させることができません。

http://code.djangoproject.com/ticket/5247#comment:6

私のモデルとフォーム:

class Company(models.Model):
    company_name = models.CharField(max_length=200)

class Contact(models.Model):
    company = models.ForeignKey(Company)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

class Action(models.Model):
    company = models.ForeignKey(Company, blank=True, null=True)
    from_company = models.ManyToManyField(Contact, verbose_name='Participant(s) from "Company"', blank=True, null=True)

class Action_Form(ModelForm):
    from_company = forms.ModelMultipleChoiceField(queryset=Contact.objects.none(), widget=forms.CheckboxSelectMultiple())
    class Meta:
        model = Action

私がしていることと結果:

>>> contacts_from_company = Contact.objects.filter(company__exact = 1)#テストの場合は「1」、それ以外の場合は変数
>>> form = Action_Form(initial = {'from_company':[o.pk for o incontacts_from_company]})#修正で提案されたとおり
>>>印刷フォーム['from_company']
<ul>
</ ul>
>>>印刷contacts_from_company
[<連絡先:テスト担当者>、<連絡先:別の人>]

>>> form2 = Action_Form(initial = {'from_company':contacts_from_company})
>>> print form2 ['from_company']
<ul>
</ ul>

>>> form3 = Action_Form(initial = {'from_company':Contact.objects.all()})
>>> print form3 ['from_company']
<ul>
</ ul>

私が期待していた方法:
1。ビューはrequest.GETから「company」を取得します
2.次にその「company」のすべての「contacts」をフィルタリングし
ます3.最後に、フォームを作成し、それらの「contacts」を次のように渡します"initial ={...}"

2つの質問:
1。[まだ回答されていません] ModelMultipleChoiceFieldにこれらの「初期」値を取得させるにはどうすればよいですか?
2. [回答済み]別の方法として、変数をAction_Form(ModelForm)に渡して、ModelFormで次のことができるようにすることはできますか。

from_company = forms.ModelMultipleChoiceField(queryset=Contact.objects.filter(company__exact=some_id) # where some_id comes from a view
4

4 に答える 4

23

1)に返信します

1. ModelMultipleChoiceFieldにこれらの「初期」値を取得させるにはどうすればよいですか?

これは、Action_Form __init__ModelMultipleChoiceFieldinitial属性を使用してメソッドで実行できます。

Djangoのソースコード(db / models / fields / related.py)にあるようにdef formfield(self, **kwargs)

        # If initial is passed in, it's a list of related objects, but the
        # MultipleChoiceField takes a list of IDs.

したがって、IDのリストを指定する必要があります。

class Action_Form(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(Action_Form, self).__init__(*args, **kwargs)
        self.fields['from_company'].initial = [c.pk for c in Contact.object.filter()]
于 2009-10-07T10:01:37.887 に答える
15

初期値を設定する__init__メソッドを追加する必要がありますが、 superを介して基本クラスを呼び出すことを忘れないでください。Action_Form__init__ModelForm

class Action_Form(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(Action_Form, self).__init__(*args, **kwargs)
        self.fields['from_company'].queryset = Contact.object.filter(...

フィルタ パラメータをキーワード引数として に渡す予定がある場合Action_Formは、super を呼び出す前にそれらを削除する必要があります。

myfilter = kwargs['myfilter']
del kwargs['myfilter']

または、おそらくより良い:

myfilter = kwargs.pop('myfilter')

詳細については、Django の Dynamic ModelFormsに関する別のリンクを参照してください。

于 2009-01-28T15:45:06.063 に答える
13

前の回答が十分に単純ではなかった場合は、1) に再度回答してみます。

  1. ModelMultipleChoiceField にこれらの「初期」値を取得させるにはどうすればよいですか?

元の質問のままAction_Formにして、これを使用して、必要なものを正確にレンダリングできます。

>>> form4 = Action_Form(initial={'from_company': Contact.objects.all().values_list('id',flat=True)})
>>> print form4['from_company']
于 2010-10-12T13:13:25.147 に答える
12

(1)の質問に答えます!

これは機能しません:

self.fields['from_company'].initial = [c.pk for c in Contact.object.filter()]

しかし、これは本当にうまくいきます:

self.initial['from_company'] = [c.pk for c in Contact.object.filter()]
于 2013-12-18T15:14:45.887 に答える