20

我的一个模型中有一个字段,如下所示:

 payrollProvider = models.CharField(max_length=2, choices=PAYROLL_CHOICES)
 PAYROLL_CHOICES = (
        ('C1', 'Choice1'),
        ('C2', 'Choice2')
        etc.....
                    )

当我为此字段创建模型表单时,Django 正确生成了一个 HTML 选择框,但包含一个默认的空白值“----------”。

我想知道如何将此默认值更改为其他文本,例如“请选择值”。

我相信我应该能够通过以下方式在我的模型表单的init中进行设置,如本答案和其他几个文件中所述:

self.fields['payrollProvider'].empty_label = "please choose value"

但是,这对我不起作用。当我在表单的init中包含该行时,“--------”仍然显示为选择框中的初始选项。我在下面粘贴相关的 forms.py ,但似乎其他人也无法访问/修改 empty_label。在这个链接上,提问者描述了一种删除默认 empty_label 值的方法(我能够通过他的方法成功地做到这一点),但我真正想做的是修改显示的 empty_label。

有任何想法吗?

这是 forms.py 中表单的代码,其中的 empty_label 代码无法成功更改默认“----------”:

class PayrollCredentialForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(PayrollCredentialForm, self).__init__(*args, **kwargs)
        self.fields['payrollUsername'].widget.attrs.update({'class' : 'yp-signup'})
        self.fields['payrollPassword'].widget.attrs.update({'class' : 'yp-signup'})
        self.fields['payrollProvider'].widget.attrs.update({'class' : 'yp-signup'})
        self.fields['payrollUsername'].widget.attrs.update({'placeholder' : '  Payroll Username'})
        self.fields['payrollPassword'].widget.attrs.update({'placeholder' : '  Payroll Password'})
        self.fields['payrollProvider'].empty_label = "please choose value"


class Meta:
    model = Company
    fields = ('payrollProvider', 'payrollUsername', 'payrollPassword')
    widgets = {
        'payrollPassword': forms.PasswordInput(),
    }
4

8 回答 8

15

dokkaebi,那将无法正常工作。您将收到以下选择代码:

<select name="payrollProvider" id="id_payrollProvider">
<option value="" selected="selected">---------</option>
<option value="" selected="selected">please choose value</option>
<option value="C1">Choice1</option>
<option value="C2">Choice2</option>
</select>

我想到的唯一相对方便的方法是以以下形式执行以下操作:

class PayrollCredentialForm(forms.ModelForm):
    class Meta:
        model = Company
    def __init__(self, *args, **kwargs):
        super(PayrollCredentialForm, self).__init__(*args, **kwargs)
        self.fields["payrollProvider"].choices = [("", "please choose value"),] + list(self.fields["payrollProvider"].choices)[1:] 
于 2012-12-25T16:36:30.430 回答
10

实际上,现在(对于Django 1.8和更高版本)覆盖了一个empty_label作品:

class PayrollCredentialForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(PayrollCredentialForm, self).__init__(*args, **kwargs)
        self.fields['payrollProvider'].empty_label = 'Please, choose value'

此外,如果您使用Django Admin,则可以选择为列表视图设置空值:

class PayrollCredentialAdmin(admin.ModelAdmin):
    list_display = ('payrollProvider_value', )

    def payrollProvider_value(self, instance):
        return instance.payrollProvider
    payrollProvider_value.empty_value_display = 'Empty value'

如果字段应该是readonly什么?

如果以这种方式修改的字段应该是,则有一个问题readonly

readonly_fields如果在类内的属性中指定覆盖的表单字段PayrollCredentialAdmin,则会导致KeyError异常PayrollCredentialForm(因为readonly字段不会包含在表单中self.fields)。为了处理这个问题,需要覆盖formfield_for_dbfield而不是使用readonly_fields

def formfield_for_dbfield(self, db_field, **kwargs):
    field = super(PayrollCredentialAdmin, self).formfield_for_dbfield(
        db_field, **kwargs
    )
    db_fieldname = canonical_fieldname(db_field)

    if db_fieldname == 'payrollProvider':
        field.widget = forms.Select(attrs={
            'readonly': True, 'disabled': 'disabled',
        })

    return field

可能有用。


Django 更新1.11

下面的评论带来了这样的假设,即这种覆盖对于较新版本的 Django 不再有效。

于 2016-11-29T14:39:25.673 回答
8

问题是您正在尝试指定不适用于 Select 字段类型的内容。

empty_label 选项适用于 forms.ModelChoiceField,它恰好使用 Select 小部件,但与您提供选项的 CharField 的字段类型不同。

https://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield

您也可以在此处的上一个问题中看到这一点:https ://stackoverflow.com/a/740011/1406860

您可以尝试覆盖模型表单的 html 以将第一个选项添加为“请选择值”。或者,您可以使用模板过滤器来做同样的事情。最后,您可以 and ("", "please choose value") 到 PAYROLL_CHOICES,如果您不希望在没有 payrollProvider 的情况下提交它,只需为模型中的字段设置空白 = False。

京东

于 2012-10-20T01:20:40.603 回答
2

在您的 forms.py 文件中,这肯定会起作用..试试这个...

     class Meta:
        model = StaffDetails
        fields =['photo','email', 'first_name','school','department', 'middle_name','last_name','gender', 'is_active']
     def __init__(self, *args, **kwargs):
        super(StaffDetailsForm, self).__init__(*args, **kwargs)
        self.fields['Field_name'].empty_label = 'Please Select' 

它对我有用..只需将字段名称替换为您的...

于 2017-05-26T07:03:53.537 回答
1

ModelChoiceField(为ForeignKey字段生成)支持该empty_label参数,在这种情况下很难获得,因为这些字段通常是django.forms.models.ModelFormMetaclass在调用django.forms.models.modelform_factory.

ModelFormMetaclass使用empty_label参数将另一个选项添加到列表中,empty_label作为显示和''作为它的值。

做你想做的最简单的方法就是在你的选择列表中添加一个空选项:

PAYROLL_CHOICES = (
        ('', 'please choose value'),
        ('C1', 'Choice1'),
        ('C2', 'Choice2'),

        etc.....
                    )
于 2012-10-20T01:14:40.793 回答
1

另一个对我有用的简单方法是:

country = forms.ModelChoiceField(queryset=Country.objects.filter(), empty_label='--Select--')

但是,我的 Django 版本是 2.2.7

于 2020-05-24T08:36:02.110 回答
0

改编自Javed的答案。由于我的表单中有大量字段,我只想用占位符替换 html 中的所有标签,因此对于选择标签,我使用它们的字段标签。

class PacienteForm(forms.ModelForm):

    class Meta:
        model=Paciente
        fields=('__all__')

    def __init__(self, *args, **kwargs):
        super(PacienteForm, self).__init__(*args, **kwargs)

        for f in self.fields:
            if hasattr(self.fields[f], 'choices'):
                choices=self.fields[f].choices
                if type(choices) == list:
                    choices[0]=('',self.fields[f].label)
                    self.fields[f].choices=choices
于 2021-08-05T09:39:14.053 回答
0

只需向您添加model.field.choices一个值为None的元组:

 payrollProvider = models.CharField(max_length=2, choices=PAYROLL_CHOICES)
 PAYROLL_CHOICES = (
        (None, 'please choose'),
        ('C1', 'Choice1'),
        ('C2', 'Choice2')
        etc.....
                    )

文档(v4.0)

除非在字段上设置了空白=假以及默认值,否则将使用选择框呈现包含“---------”的标签。要覆盖此行为,请向包含 None 的选项添加一个元组;例如(无,'您的显示字符串')。或者,您可以在有意义的情况下使用空字符串而不是 None - 例如在 CharField 上。

于 2021-12-26T13:26:34.190 回答