为了确保我强制用户从下拉列表中选择一个有效值(而不是在不知不觉中将第一个选项留在列表集中而不将其更改为正确的值),我在许多要求中插入空白选择字段表格领域。
models.py
class MyModel(models.Model):
gender = models.CharField(max_length=1, null=True, blank=False, choices=GENDER_CHOICES, default='')
原始forms.py(明确定义表单字段。这有效。)
from django.db.models.fields import BLANK_CHOICE_DASH
class MyForm(forms.ModelForm):
gender = forms.TypedChoiceField(required=True, choices=BLANK_CHOICE_DASH+MyModel._meta.get_field('gender').choices)
class Meta:
model = MyModel
fields = '__all__'
现在,因为我在很多领域都这样做,所以我尝试在forms.py中修改我之前的代码:
修订了forms.py(在__init__()
中设置选项。无效。)
class MyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
for type in ('gender', ...):
self.fields[type].choices.insert(0, (u'',u'---------' ))
# Not needed anymore.. replaced by code in __init__()
# gender = forms.TypedChoiceField(required=True, choices=BLANK_CHOICE_DASH+MyModel._meta.get_field('gender').choices)
class Meta:
model = MyModel
fields = '__all__'
在这种情况下,我不会将破折号作为下拉列表的第一选择。
我试图通过在模板中使用pdb
来检查问题,以便在输出之前检查表单字段。调试器在两个案例中显示element.field.choices
为(u'', u'---------'), ('f', 'Female'), ...]
。然而,输出表单字段的代码仅在原始代码中插入破折号,而不是在修订后的代码中。
我尝试逐步执行Django代码,该代码渲染表单字段以确定它是否正在使用除.choices
之外的其他字段,我不知道,但我从未进入代码的正确部分
任何想法如何实现这一目标?虽然第一种方式工作正常,但修改后的代码干得太多......如果我能使它工作的话!谢谢!