在 Django 中,我使用带有empty_label 参数的 ModelChoiceField 来允许用户取消选择下拉列表中的值。代码如下:
department = forms.ModelChoiceField(
queryset=Department.objects.all(),
label="Department",
required=False,
empty_label="------" # Add an empty option
)
这工作正常,但默认行为分配一个空字符串(“”)作为empty_label选项的值。不幸的是,我正在使用的 JavaScript 库之一无法正确处理空字符串值。
我需要为empty_label选项分配一个自定义值(例如-1),但我仍然想保留其“取消选择”当前对象的功能。
我尝试覆盖 init 方法中的选择,如下所示:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['department'].widget.choices = [("-1", "------")] + list(
self.fields['department'].queryset.values_list('id', 'name')
)
但是,当我这样做时,该功能无法按预期工作 - 它不允许像使用empty_label那样使用“取消选择”选项。
如何将empty_label值(从空字符串)更改为-1并仍然保持取消选择选项的相同行为?
预先感谢您的帮助!
您可以使用
ModelChoiceIterator
的补丁编写自己的代码:
from django.forms.models import ModelChoiceIterator
class MyModelChoiceIterator(ModelChoiceIterator):
def __iter__(self):
if self.field.empty_label is not None:
yield ('-1', self.field.empty_label)
queryset = self.queryset
if not queryset._prefetch_related_lookups:
queryset = queryset.iterator()
for obj in queryset:
yield self.choice(obj)
然后将其插入
ModelChoiceField
的子类中: MyModelChoiceField
:
from django.forms.models import ModelChoiceField
class MyModelChoiceField(ModelChoiceField):
iterator = MyModelChoiceIterator
然后将此模型字段插入到您的表单中。