Почему бы не использовать ModelMultipleChoiceField
вместо этого?
Вы можете сделать это просто:
class NavigatorExportForm(forms.Form):
languages = forms.ModelMultipleChoiceField(queryset=Language.objects.all())
def __init__(self, app_id, *args, **kwargs):
super(NavigatorExportForm, self).__init__(*args, **kwargs)
# Dynamically refine the queryset for the field
self.fields['languages'].queryset = Navigator.admin_objects.get(id=app_id).languages.all()
Таким образом, вы не только ограничивает выбор, доступный в виджете, но и в поле (что дает вам проверку данных).
При использовании этого метода отображаемая строка в виджете будет результатом метода __unicode__
объекта Language
. Если это не то, что вам нужно, вы можете написать следующее настраиваемое поле, как описано в ModelChoiceField
reference :
class LanguageMultipleChoiceField(forms.ModelMultipleChoiceField):
def label_from_instance(self, obj):
return obj.language_code # for example, depending on your model
и используйте этот класс вместо ModelMultipleChoiceField
в вашей форме.