有没有办法将一个empty_label放在一个非模型形式的Django Select字段中?

时间:2014-03-15 06:56:21

标签: django django-forms

我想在Django Select字段中使用占位符,但我不想将其包含在选项中。

我创建了一个空字段,如下所示:https://stackoverflow.com/a/6085935/2532070

choices = [(u'', u'Select Year')]
choices.extend([(unicode(year), unicode(year)) for year in range(1970, 2015)])
graduation = forms.ChoiceField(choices=choices)

此答案涵盖empty_label的{​​{1}}参数:Customize/remove Django select box blank option

但我的是常规的Django形式。有没有办法让默认按钮渲染"选择年份"但不包括"选择年份"在下拉列表中?谢谢!

1 个答案:

答案 0 :(得分:1)

您是否尝试在表单字段中添加某种自动填充功能?我会告诉你2种不同的方法,但是根据你想做什么,一个比另一个好。

第一种方式

这种方式是"泛型",如果您尝试使用类似select2的内容,那么您的最佳答案是第二种方式

choices = [
    (u'', u'Select Year'),
    (u'1', u'1231'),
    (u'2', u'1232')
    (u'3', u'1233')
]
class your_form(forms.Form):

    year = forms.ChoiceField(choices=YEAR_CHOICES, required=False)

    def __init__(self, *args, **kwargs):
        super(your_form, self).__init__(*args, **kwargs)            
        self.fields['year'].queryset = YEAR_MODEL.objects.none()
        self.fields['year'].widget = forms.TextInput(attrs={'placeholder': _(u'Select Year')})

第二种方式

如果您尝试通过AJAX添加select2,则需要在模板中接收非选择字段,因此您需要以下内容:

class your_form(forms.Form):

    year = forms.CharField(max_length=255, required=False)

    def __init__(self, *args, **kwargs):
        super(your_form, self).__init__(*args, **kwargs)            
        self.fields['year'].widget = forms.TextInput(attrs={'placeholder': _(u'Select Year')})

第一种方式和第二种方式之间的区别在于,字段year的第一种方式是ChoiceField我们覆盖__init__函数以使选择器为空,第二种方式一个只是CharField,我们可以根据需要进行管理(这种方式是为了防止您尝试通过AJAX使用select2自动完成功能)

在两个示例中,我们使用以下方法初始化文本框:

self.fields['year'].widget = forms.TextInput(attrs={'placeholder': _(u'Select Year')})

__init__覆盖