Как изменить required = false на ввод, который требуется

#javascript #html #django

Вопрос:

В моем html — файле есть выбор с тремя различными вариантами. Если вы выберете один из них, он будет отображать разные входные данные в зависимости от выбранного вами варианта, но эти входные данные требуются по умолчанию, и я не смогу отправить форму, если не заполню все входные данные.

 function yesnoCheck(that) {
  if (that.value == "1") {
    document.getElementById("ifStudent").style.display = "block";
  } else {
    document.getElementById("ifStudent").style.display = "none";
  }
  if (that.value == "2") {
    document.getElementById("ifAcademic").style.display = "block";
  } else {
    document.getElementById("ifAcademic").style.display = "none";
  }

  if (that.value == "3") {
    document.getElementById("ifWorker").style.display = "block";
  } else {
    document.getElementById("ifWorker").style.display = "none";
  }
} 
 <div class="select">
  <select onchange="yesnoCheck(this);" name="school_role" required>
    <option value="">--------</option>
    <option value="1">Student</option>
    <option value="2">Academic</option>
    <option value="3">Employee</option>
  </select>
</div>

<div id="ifStudent" style="display: none;">
  <label class="label">Account number</label>
  <input class="input" type="text" name="account_number" value="{{ studentform.account_number.value }}" placeholder="Account number">
  <div class="help is-danger">
    {% for error in studentForm.account_number.errors %}{{ error }}{% endfor %}
  </div>

  <div id="ifEmployee" style="display: none;">
    <label class="label">Employee Number</label>
    <input class="input" type="text" name="employee_number" value="{{ employeeForm.employee_number.value }}" placeholder="Employee number">
    <div class="help is-danger">
      {% for error in employeeForm.employee_number.errors %}{{ error }}{% endfor %}
    </div>

    <div id="ifAcademic" style="display: none;">
      <label class="label">Academic number</label>
      <input class="input" type="text" name="academic_number" value="{{ academicForm.academic_number.value }}" placeholder="Academic number">
      <div class="help is-danger">
        {% for error in academicForm.academic_number.errors %}{{ error }}{% endfor %}
      </div> 

Комментарии:

1. См. отформатированный код. Вы пропускаете </div> в каждом div ifXX

Ответ №1:

Добавьте required атрибут ко всем входным данным. Я не уверен в стиле кода, но в качестве логического примера:

 <input ... name="account_number" required="{{school_role === 1}}" ... />
 

Ответ №2:

  1. Добавить </div> в каждый раздел
  2. Дайте каждому div класс скрытия
  3. Переключите скрытие при изменении выбранного
  4. переключите необходимое
 const ifs = [...document.querySelectorAll("[id^=if]")];
document.getElementById("school_role").addEventListener("change", function() {
  const val = this.options[this.selectedIndex].textContent;
  ifs.forEach(ifDiv => {
    ifDiv.classList.toggle("hide", !ifDiv.id.includes(val))
    const input = ifDiv.querySelector("input");
    if (ifDiv.classList.contains("hide")) input.removeAttribute("required")
    else input.setAttribute("required", true)
  });
}) 
 .hide {
  display: none;
} 
 <div class="select">
  <select name="school_role" id="school_role" required>
    <option value="">--------</option>
    <option value="1">Student</option>
    <option value="2">Academic</option>
    <option value="3">Employee</option>
  </select>
</div>
<form>
  <div id="ifStudent" class="hide">
    <label class="label">Account number</label>
    <input class="input" type="text" name="account_number" value="" placeholder="Account number">
    <div class="help is-danger">
      {% for error in studentForm.account_number.errors %}{{ error }}{% endfor %}
    </div>
  </div>
  <div id="ifEmployee" class="hide">
    <label class="label">Employee Number</label>
    <input class="input" type="text" name="employee_number" value="" placeholder="Employee number">
    <div class="help is-danger">
      {% for error in employeeForm.employee_number.errors %}{{ error }}{% endfor %}
    </div>
  </div>
  <div id="ifAcademic" class="hide">
    <label class="label">Academic number</label>
    <input class="input" type="text" name="academic_number" value="" placeholder="Academic number">
    <div class="help is-danger">
      {% for error in academicForm.academic_number.errors %}{{ error }}{% endfor %}
    </div>
  </div>
  <input type="submit">
</form>