我有一个问题,如何从选择下拉菜单中删除----而不是在第一行显示空(---)。我从RadioSelect上的stackoverflow发现我设法摆脱---但我被困在选择下拉菜单...... :( 这是我的编码示例。
models.py
colorradio = (("1" , 'Yellow'),
("2" , 'Red'),
("3" , 'Blue'),
("4" , 'Black'),)
COLORRADIO = models.CharField(max_length = 2, choices = colorradio, null = True, blank = True)
colorselect= (("1" , 'Yellow'),
("2" , 'Red'),
("3" , 'Blue'),
("4" , 'Black'),)
COLORSELECT= models.CharField(max_length = 2, choices = colorselect, null = True, blank = True)
forms.py
class RadioSelectNotNull(RadioSelect, Select):
def get_renderer(self, name, value, attrs=None, choices=()):
"""Returns an instance of the renderer."""
if value is None: value = ''
str_value = force_unicode(value) # Normalize to string.
final_attrs = self.build_attrs(attrs)
choices = list(chain(self.choices, choices))
if choices[0][0] == '':
choices.pop(0)
return self.renderer(name, str_value, final_attrs, choices)
class RainbowForm(ModelForm):
class Meta:
model = Rainbow
widgets = {'COLORRADIO':RadioSelectNotNull(), # this is correct and NOT shown ---
'COLORSELECT':RadioSelectNotNull(), #should be in dropdown menu
}
我确实希望将COLORSELECT
显示为下拉菜单,而不是在第一行显示----。但是,如果我像上面的代码一样使用COLORSELECT
作为RadioSelect
并且没有显示----(这是我想要的不显示---)而不是RadioSelect
提前非常感谢你。
答案 0 :(得分:1)
models.CharField
会在有选择时使用TypedChoiceField
表单字段。因此无需手动指定它(也是其django.forms.fields.TypedChoiceField
)。
尝试删除blank=True
并设置默认值(或在formfield
中提供初始值,通常您不必执行此操作,ModelForm
会为您处理它)。让CharField
可以为空的也没有意义;我按惯例切换变量名COLORSELECT
和colorselect
。
>>> COLORSELECT = (("1" , 'Yellow'),
... ("2" , 'Red'),
... ("3" , 'Blue'),
... ("4" , 'Black'),)
>>> colorselect = models.CharField(max_length=2, choices=COLORSELECT, default='1')
>>> colorselect.formfield().__class__
django.forms.fields.TypedChoiceField
>>> print(colorselect.formfield().widget.render('','1'))
<select name="">
<option value="1" selected="selected">Yellow</option>
<option value="2">Red</option>
<option value="3">Blue</option>
<option value="4">Black</option>
</select>