2010-04-12 4 views
4

Я создаю форму (не modelForm), где я бы хотел использовать виджет SelectMultiple Widget, чтобы отображать варианты на основе запроса, выполненного во время инициализации формы.Динамический выбор для Django SelectMultiple Widget

Я могу придумать несколько способов сделать это, но я не совсем четко понимаю, как это сделать. Я вижу разные варианты.

Я получаю «выбор», я должен перейти к виджету в форме init, но я не уверен, как я должен их передавать.

class NavigatorExportForm(forms.Form): 

def __init__(self,user, app_id, *args,**kwargs): 
    super (NavigatorExportForm,self).__init__(*args,**kwargs) # populates the form 
    language_choices = Navigator.admin_objects.get(id=app_id).languages.all().values_list('language', flat=True) 

languages = forms.CharField(max_length=2, widget=forms.SelectMultiple(choices=???language_choices)) 

ответ

6

Почему бы не использовать 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 в вашей форме.

+0

Я видел упоминание о ModelMultipleChoiceField, но не был уверен в использовании. Попытка это прямо сейчас. Благодарю. – philgo20

+0

отлично работает и кажется немного чище, чем мой. еще раз спасибо – philgo20

+0

mmm На самом деле, я получаю объект «AttributeError: 'unicode» при атрибуте формы не имеет атрибута «get». Моя языковая модель действительно поле символов ... – philgo20

0
def __init__(self,user, app_id, *args,**kwargs): 
super (NavigatorExportForm,self).__init__(*args,**kwargs) 
self.fields['languages'].widget.choices = Navigator.admin_objects.get(id=app_id).languages.all().values_list('language', flat=True) 

, что, кажется, делает трюк, но даже не указав max_length, виджет показывает только первую букву выбора ...

+0

выбор должен быть списком/кортежем следующих кортежей (int_or_str_key, 'name') –

+0

для получения об этом спасибо – philgo20

Смежные вопросы