В модели
Membership есть поле
role с типом
CharField. На основе этой модели была создана форма
ProjectMembersForm (ModelForm). Пытаюсь в форме сделать недоступным для пользователя выбор некоторых значений () в choices, при этом, чтобы он мог видеть это значение. Например: значение developer сделать disabled. Для этого решил немного изменить виджет, но в итоге значение все равно можно выбрать. В template выводится:
<option value="{'disabled': True, 'label': 'developer'}">Developer</option>
Что было мною сделано не так и почему после атрибута value не добавляется disabled='disabled'. Как добиться правильного результата?
models.py:
ROLE_CHOICES = (
('manager', 'Manager'),
('developer', 'Developer'),
('singer', 'Singer'),
('musician', 'Musician'),
)
class Membership (models.Model):
***ДРУГИЕ ПОЛЯ***
role = models.CharField(max_length=20, choices=ROLE_CHOICES,)
forms.py:
class ProjectMembersForm(forms.ModelForm):
class Meta:
model = Membership
widgets = {
'role': SelectWithDisabled(),
}
exclude = ('project',)
def __init__(self, *args, **kwargs):
super(ProjectMembersForm, self).__init__(*args, **kwargs)
self.fields['role'].choices = tuple(choice if choice[0] not in ['developer'] else ({'disabled': True, "label": choice[0]}, 'Developer') for choice in ROLE_CHOICES)
class SelectWithDisabled(Select):
def render_option(self, selected_choices, option_value, option_label):
option_value = force_text(option_value)
if option_value in selected_choices:
selected_html = u' selected="selected"'
else:
selected_html = ''
disabled_html = ''
if isinstance(option_label, dict):
if dict.get(option_label, 'disabled'):
disabled_html = u' disabled="disabled"'
option_label = option_label['label']
return u'<option value="%s"%s%s>%s</option>' % (
escape(option_value), selected_html, disabled_html,
conditional_escape(force_text(option_label)))