我创建了一个带有外键的模型:
class Book(models.Model):
library = models.ForeignKey(Library, null=False, blank=False)
...
然后我创建了一个带有ModelForm的表单,以显示给用户:
class BookSubmitForm(ModelForm):
class Meta:
model = Book
当我显示带有表单的页面时,我会获得库选项,但也会默认显示空白(--------)选项。
我认为在模型中使用null = False和blank = False可以摆脱ModelForm中的空白选择但是没有。我该怎么做只在列表中有实际选择而不是那个?
答案 0 :(得分:35)
见ModelChoiceField。您必须将empty_label设置为None。所以你的代码将是:
class BookSubmitForm(ModelForm):
library = ModelChoiceField(queryset=Library.objects, empty_label=None)
class Meta:
model = Book
编辑:将字段名称更改为小写
答案 1 :(得分:10)
如果您使用ModelForm,那么您不必指定queryset,required,label等。但是对于upvoted答案,您必须再次执行此操作。
实际上你可以这样做以避免重新指定所有内容
class BookSubmitForm(ModelForm):
def __init__(self, *args, **kwargs):
super(BookSubmitForm, self).__init__(*args, **kwargs)
self.fields['library'].empty_label = None
class Meta:
model = Book
答案 2 :(得分:10)
self.fields['xxx'].empty_label = None
无法使用如果您的字段类型为TypedChoiceField
且没有empty_label
属性。
我们应该做的是删除第一选择:
class BookSubmitForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(BookSubmitForm, 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:]
答案 3 :(得分:7)
如果在模型字段定义中指定blank=False
和default=<VALUE>
,则默认情况下Django不会呈现空白选项;请注意,默认值可以是无效选项,例如设置为''
或任何invalid choice
。
class Book(models.Model):
library = models.ForeignKey(Library, null=False, blank=False, default='')
...
答案 4 :(得分:0)
只需转到您的选择列表(假设您已将其设为CharField)并为None
提供以下代码:
此外,请记住,这是一个示例,与所涉及的代码无关。它只是为了帮助任何使用默认选项的人。
GENDER_CHOICES = (
(None, 'Sex:'),
('M', 'Male'),
('F', 'Female'),
('G', 'Gay'),
('L', 'Lesbian'),
('B', 'Bi'),
('O', 'Other')
)
Choose_gender = models.CharField(max_length=1, choices=GENDER_CHOICES, blank=True)
通过指定None
,您告诉选择字段默认为特定字符串。如果您不希望默认设置为无,则只需将''
放在空括号中即可。