我遇到一个简单的问题:如何通过modelForm生成的下拉菜单中有一些"禁用"字段,并在django Framework中选择了什么?
目前,我无法弄清楚如何获得这样的输出: - 根1条目 - (禁用) - Elt 1 - (未禁用) - 根2条目 - (禁用)
你有什么建议吗?
皮埃尔
Django的表单小部件提供了一种传递应该在标记上呈现的属性列表的方法:
my_choices = ( ('one', 'One'), ('two', 'Two')) class MyForm(forms.Form): some_field = forms.ChoiceField(choices=my_choices, widget=forms.Select(attrs={'disabled':'disabled'}))
不幸的是,这对您不起作用,因为该属性将应用于呈现的每个选项标记.Django无法自动知道哪些应该启用以及哪些应该被禁用.
在您的情况下,我建议编写自定义小部件.这很容易做到,而且你没有那么多的自定义逻辑可以应用.关于这方面的文档就在这里.简而言之:
子类forms.Select
,它是默认的选择渲染器
在您的子类中,实现该render(self, name, value, attrs)
方法.使用您的自定义逻辑来确定是否有value
资格需要禁用.有一个在很短的实施render
中django/forms/widgets.py
,如果你需要inspriation.
然后,定义表单字段以使用自定义窗口小部件:
class MyForm(forms.Form): some_field = forms.ChoiceField(choices=my_choices, widget=MyWidget)
您可以像这样创建布莱恩所提到的选择.在以下选项Root 1中,Root 2会自动禁用,它们看起来像Group Options
CHOICES = ( ('-- Root 1--', ( ('ELT1', 'ELT1'), ('ELT2', 'ELT2'), ('ELT3', 'ELT3'), ) ), ('-- Root 2--', ( ('ELT3', 'ELT3'), ('ELT4', 'ELT4'), ) ), )
以上选项将显示如下.在下图中,根1和根2不可选.
希望这能解决你的问题
-Vikram
field_choices = ( ('','Make choice'), (1,'first'), (2,'second'), (3,'third') ) from django.forms import Select class Select(Select): def create_option(self, *args,**kwargs): option = super().create_option(*args,**kwargs) if not option.get('value'): option['attrs']['disabled'] = 'disabled' if option.get('value') == 2: option['attrs']['disabled'] = 'disabled' return option