Django - 无法从TypedChoiceField中删除empty_label

时间:2012-01-19 15:20:38

标签: django django-forms

我的模型中有字段:

TYPES_CHOICES = (
    (0, _(u'Worker')),
    (1, _(u'Owner')),
)
worker_type = models.PositiveSmallIntegerField(max_length=2, choices=TYPES_CHOICES)

当我在ModelForm中使用它时,它具有“---------”空值。它是TypedChoiceField所以它没有empty_label属性。所以我不能用 init 方法覆盖它。

有没有办法删除“---------”?

该方法也不起作用:

def __init__(self, *args, **kwargs):
        super(JobOpinionForm, self).__init__(*args, **kwargs)
        if self.fields['worker_type'].choices[0][0] == '':
            del self.fields['worker_type'].choices[0]

编辑:

我设法让它以这种方式运作:

def __init__(self, *args, **kwargs):
    super(JobOpinionForm, self).__init__(*args, **kwargs)
    if self.fields['worker_type'].choices[0][0] == '':
        worker_choices = self.fields['worker_type'].choices
        del worker_choices[0]
        self.fields['worker_type'].choices = worker_choices

3 个答案:

答案 0 :(得分:5)

任何模型字段的空选项,其中的选项在模型字段类的.formfield()方法中确定。如果您查看此方法的django源代码,该行如下所示:

include_blank = self.blank or not (self.has_default() or 'initial' in kwargs)

因此,避免空选项的最简洁方法是在模型的字段上设置默认值:

worker_type = models.PositiveSmallIntegerField(max_length=2, choices=TYPES_CHOICES, 
                                               default=TYPES_CHOICES[0][0])

否则,您只需在表单的.choices方法中手动黑客攻击表单字段的__init__属性。

答案 1 :(得分:1)

self.fields['xxx'].empty_value = None无法使用如果您的字段类型为TypedChoiceField且没有empty_label属性。 我们应该做的是删除第一选择:

class JobOpinionForm(forms.ModelForm):

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

        for field_name in self.fields:
            field = self.fields.get(field_name)
            if field and isinstance(field , forms.TypedChoiceField):
                field.choices = field.choices[1:]

答案 2 :(得分:0)

尝试:

def __init__(self, *args, **kwargs):
    super(JobOpinionForm, self).__init__(*args, **kwargs)
    self.fields['worker_type'].empty_value = None

https://docs.djangoproject.com/en/1.3/ref/forms/fields/#typedchoicefield