Solution 1 :

Add required attribute to all inputs. I’m not confident in code style, but as a logical example:

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

Solution 2 :

  1. Add </div> to each section
  2. Give each div a class of hide
  3. Toggle the hide on change of the select
  4. toggle the required
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>

Problem :

My html file has a select, with three different options. If you select one it will display different inputs depending on what option you choose, but these inputs are required by default, and I can’t send the form if I don’t fill all the inputs.

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>

Comments

Comment posted by mplungjan

See the formatted code. You are missing

on each ifXX div

By