Flask WTForms отключение нескольких полей с несколькими кнопками - PullRequest
1 голос
/ 11 мая 2019

У меня есть форма в Flask, созданная с помощью WTForms.Включает 3 флажка и 9 других полей.7 из этих полей отключены, если отмечен один из трех флажков.

Вот лишь небольшая выборка флажка, поле, которое отключается при установке флажка, а также класс OptionalIf, который делаетвыбранное поле необязательно, если флажок отмечен:

class OptionalIf(Optional):

    def __init__(self, otherFieldName, *args, **kwargs):
        self.otherFieldName = otherFieldName
        #self.value = value
        super(OptionalIf, self).__init__(*args, **kwargs)

    def __call__(self, form, field):
        otherField = form._fields.get(self.otherFieldName)
        if otherField is None:
            raise Exception('no field named "%s" in form' % self.otherFieldName)
        if bool(otherField.data):
            super(OptionalIf, self).__call__(form, field)

Внутри моего класса формы:

holiday = BooleanField('Holiday?', id="holiday", validators=[Optional()])
start_time = TimeField(label='Start Time', id='timepick1', format='%H:%M', validators=[OptionalIf('holiday'), OptionalIf('holiday_noAddedHours'), OptionalIf('sick')])

holiday_noAddedHours и sick - это другие поля флажка, каждое из которых имеетих собственные ID: holidayNAH и sick.

Поскольку есть семь полей, которые нужно отключить, я должен иметь это в своих скриптах:

document.getElementById('holiday').onchange = function(){
  document.getElementById('timepick1').disabled = this.checked;
  document.getElementById('timepick2').disabled = this.checked;
  ....
}
document.getElementById('holidayNAH').onchange = function(){
  document.getElementById('timepick1').disabled = this.checked;
  document.getElementById('timepick2').disabled = this.checked;
  ....
}

А затем еще одно дляsick ID.

Мне было интересно, можно ли сократить это, вместо того, чтобы иметь 3 document.getElementById s и семь строк в этом, отключая поля, если флажок установлен?Я понимаю, что иметь один идентификатор невозможно, так как он getElementById получает первый элемент, поэтому как мне поступить?

Спасибо за любой совет.

1 Ответ

1 голос
/ 11 мая 2019

Как насчет цикла for над списком идентификаторов, которые вы хотите изменить.Например:

all_ids = ['timepick1', 'timepick2'];


for (i=0; i<all_ids.length; i++){
    document.getElementById(all_ids[i]).disabled = this.checked;
}
...