@nurzhannogerbek

Как добавить disabled в значения CharField?

В модели 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)))
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы