如何更改 modelForm 选择字段的 empty_label?

新手上路,请多包涵

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

 PAYROLL_CHOICES = (
    ('C1', 'Choice1'),
    ('C2', 'Choice2')
    etc.....
)

payrollProvider = models.CharField(max_length=2, choices=PAYROLL_CHOICES)

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

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

我相信我应该能够通过以下方式在我的模型表单的 初始化 中设置它,如 本答案 和其他几个答案中所述:

 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(),
    }

原文由 CQP 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 731
2 个回答

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

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

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

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

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

京东

原文由 jondykeman 发布,翻译遵循 CC BY-SA 3.0 许可协议

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:]

原文由 pythonpro 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题