我想在我的Django
应用程序中使用ModelMultipleChoiceField
和select2
。
这是forms.py
:
#forms.py
class SymbolForm(forms.Form):
symbol = forms.ModelMultipleChoiceField(queryset=Symbol.objects.all(), label='symbol')
一切都很好,除了一件事。Symbol
表大约有5000条记录,当html呈现时,所有数据都传递给html模板。我不想要。
我改变了我的形式:
# forms.py
class SymbolForm(forms.Form):
symbol = forms.ModelMultipleChoiceField(queryset=Symbol.objects.all(), label='symbol')
def __init__(self, *args, **kwargs):
super(SymbolForm, self).__init__(*args, **kwargs)
self.fields['symbol'].queryset = Symbol.objects.none()
初始化表单,不需要任何数据。新问题出现:当提交表单时,它是无效的,django说我选择的符号不合法。
事实上,我的问题是我想创建没有数据的表单,然后能够用我从select2
获得的数据验证它,但Django不允许这样做。
我能做什么?
通过使用这个问题和Sergio的答案,我发现我需要重写form的init方法:
self.fields['symbol'].queryset = Symbol.objects.none()
if 'symbol' in self.data:
try:
symbols_ids_list = list(map(int, self.data.getlist('symbol')))
self.fields['symbol'].queryset = Symbol.objects.filter(pk__in=symbols_ids_list).order_by()
except (ValueError, TypeError):
pass