我遇到一个简单的问题:如何通过modelForm生成的下拉菜单中有一些"禁用"字段,并在django Framework中选择了什么?
目前,我无法弄清楚如何获得这样的输出: - 根1条目 - (禁用) - Elt 1 - (未禁用) - 根2条目 - (禁用)
你有什么建议吗?
皮埃尔
Jar*_*die 21
Django的表单小部件提供了一种传递应该在<option>标记上呈现的属性列表的方法:
my_choices = ( ('one', 'One'), ('two', 'Two'))
class MyForm(forms.Form):
some_field = forms.ChoiceField(choices=my_choices,
widget=forms.Select(attrs={'disabled':'disabled'}))
Run Code Online (Sandbox Code Playgroud)
不幸的是,这对您不起作用,因为该属性将应用于呈现的每个选项标记.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)
Run Code Online (Sandbox Code Playgroud)
这可能是一个迟到的答案,但这是一个可以使用表单实例进行修改的简化版本。
您可以传递要禁用的值列表,即
def __init__(self, disabled_choices, *args, **kwargs):
self.disabled_choices = disabled_choices
Run Code Online (Sandbox Code Playgroud)
或者
from django.forms import Select
class SelectWidget(Select):
"""
Subclass of Django's select widget that allows disabling options.
"""
def __init__(self, *args, **kwargs):
self._disabled_choices = []
super(SelectWidget, self).__init__(*args, **kwargs)
@property
def disabled_choices(self):
return self._disabled_choices
@disabled_choices.setter
def disabled_choices(self, other):
self._disabled_choices = other
def create_option(self, name, value, label, selected, index, subindex=None, attrs=None):
option_dict = super(SelectWidget, self).create_option(
name, value, label, selected, index, subindex=subindex, attrs=attrs
)
if value in self.disabled_choices:
option_dict['attrs']['disabled'] = 'disabled'
return option_dict
Run Code Online (Sandbox Code Playgroud)
根据条件禁用选项,即用户不是超级用户。
class MyForm(forms.Form):
status = forms.ChoiceField(required=True, widget=SelectWidget, choices=(('on', 'On'), ('off', 'Off')))
def __init__(self, request, *args, **kwargs):
super().__init__(*args, **kwargs)
if not request.user.is_superuser:
self.fields['status'].widget.disabled_choices = ['off']
Run Code Online (Sandbox Code Playgroud)
您可以像这样创建布莱恩所提到的选择.在以下选项Root 1中,Root 2会自动禁用,它们看起来像Group Options
CHOICES = (
('-- Root 1--',
(
('ELT1', 'ELT1'),
('ELT2', 'ELT2'),
('ELT3', 'ELT3'),
)
),
('-- Root 2--',
(
('ELT3', 'ELT3'),
('ELT4', 'ELT4'),
)
),
)
Run Code Online (Sandbox Code Playgroud)
以上选项将显示如下.在下图中,根1和根2不可选.

希望这能解决你的问题
-Vikram
小智 5
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17332 次 |
| 最近记录: |