在没有数据的情况下初始化 ModelMultipleChoiceField 时 Django 表单不验证
Django form doesn't validate when init ModelMultipleChoiceField without data
我想在我的 Django
应用程序中使用 ModelMultipleChoiceField
和 select2
。
这是 forms.py
:
#forms.py
class SymbolForm(forms.Form):
symbol = forms.ModelMultipleChoiceField(queryset=Symbol.objects.all(), label='symbol')
除了一件事,一切都很好。 Symbol
table 有大约 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 没有允许这个。
我能做什么?
通过使用 question and Sergio答案,我发现我需要重写表单的初始化方法:
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
我想在我的 Django
应用程序中使用 ModelMultipleChoiceField
和 select2
。
这是 forms.py
:
#forms.py
class SymbolForm(forms.Form):
symbol = forms.ModelMultipleChoiceField(queryset=Symbol.objects.all(), label='symbol')
除了一件事,一切都很好。 Symbol
table 有大约 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 没有允许这个。
我能做什么?
通过使用
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