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" for test, otherwise a variable
>>> form = Action_Form(initial={'from_company': [o.pk for o in contacts_from_company]}) # as suggested in the fix
>>> print form['from_company']
<ul>
</ul>
>>> print contacts_from_company
[<Contact: test person>, <Contact: another person>]
>>> 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. Мой взгляд получает "компанию" из запроса. GET
2. Затем он фильтрует все «контакты» для этой «компании»
3. Наконец, он создает форму и передает эти «контакты» как «initial = {...}»
Два вопроса:
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