如何更改Django的ModelChoiceField中的empty_label值?

问题描述 投票:0回答:1

在 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并仍然保持取消选择选项的相同行为?

预先感谢您的帮助!

django forms django-forms
1个回答
0
投票

您可以使用

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

然后将此模型字段插入到您的表单中。

© www.soinside.com 2019 - 2024. All rights reserved.