我的模型中有字段:
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
答案 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