Django спецификация выбора шаблона c значение со скрытием и отображением - PullRequest
0 голосов
/ 27 мая 2020

Это моя модель и форма с моим выбором:

class Method(models.Model):
    principle = models.CharField(choices=PRINCIPLE_CHOICES, max_length=2)
    method = models.CharField(choices=METHOD_CHOICES, max_length=4)

class PartMethodForm(forms.ModelForm):
    principle = forms.ChoiceField(
        widget=forms.Select(
        attrs={'class': 'btn btn-primary'}), choices=PRINCIPLE_CHOICES)
    method = forms.ChoiceField(
        widget=forms.Select(
        attrs={'class': 'btn btn-primary'}), choices=METHOD_CHOICES)

METHOD_CHOICES=(
('1.1','Method 1.1'),
('1.4','Method 1.4'),
('2.2','Method 2.2'),
('10.4','Method 10.4'),
('11.3','Method 11.3')
)

PRINCIPLE_CHOICES=(
('1','Principle 1'),
('2','Principle 2'),
('10','Principle 10'),
('11','Principle 11')
)

На мой взгляд, я передаю свою форму и отфильтрованные списки моих методов и принципов, которые можно выбрать, например,

method = ['1.1','2.2','10.4']
principle = ['1','2']

Я хотел бы достичь следующего:

  1. выберите принцип (принципы, которых нет в списке, должны быть отключены для выбора)
  2. при выборе принципа затем показать только возможные методы, например, если принцип 1 -> методы 1.1 и методы 1.4 возможны
  3. выберите метод (методы, которых нет в списке, должны быть отключены для выбора)

Может кто-нибудь помочь ?

Я придумал только такой подход:

{% block content %}
<div class="container">

  <script type="text/javascript">

    function showmethod() {
        if (document.getElementById('1').checked) {

            document.getElementById('div0').style.display = 'block';
            document.getElementById('div').style.display = 'block';
        }
        else {
            document.getElementById('div').style.display = 'none';
            document.getElementById('div0').style.display = 'none';
        } 

    }

  </script>


  <h5><b>Choose principle</b></h5>
  <form class="mt-5" method="post" name="method-form" id="method-form">
  {% csrf_token %}

    <div class="col col-md-12">
    {% for value, name in form.fields.principle.choices %}

    {% if value in principle %}
      <input type="radio" onclick="javascript:showmethod();" id="{{ value }}" name="principle" value="{{ value }}">
      <label for="{{ value }}"><b>Principle{{ value }}</b><br><br>{{ name }}</label>
    {% else %}
      <input type="radio" onclick="javascript:showmethod();" id="{{ value }}" name="Principle" value="{{ value }}" disabled>
      <label for="{{ value }}"><b>Principle{{ value }}</b><br><br>{{ name }}</label>
    {% endif %}

    {% endfor %}
    </div>

    <h5>Choose method</h5>
    <div class="col col-md-12" id="div0" style="display:none">
    {% for value, name in form.fields.method.choices %}
        {% if value|cut:'everything with point and after' %}
        {% if value in method %}
        <div class="col col-md-2" id="div" style="display:none">
          <input type="radio" id="{{ value }}" name="method" value="{{ value }}">
          <label for="{{ value }}"><b>Method{{ value }}</b><br><br>{{ name }}</label>
        </div>
         {% else %}
          <input type="radio" id="{{ value }}" name="method" value="{{ value }}" disabled>
          <label for="{{ value }}"><b>Method{{ value }}</b><br><br>{{ name }}</label>
        {% endif %}
        {% endif %}
    {% endfor %}
  </div>

      </div>
    </div>
    <div class="col-md-6">
      <div class="well">
        <button class="btn btn-primary float-right" type="submit">Submit</button>
      </div>
    </div>
  </div>
  </form>
</div>


{% endblock %}

1 Ответ

0 голосов
/ 03 июня 2020

Итак, я нашел решение.

Во-первых, я изменил контекст, в котором принцип и метод теперь находятся в словаре, где принципы являются ключами.

Во-вторых, использование длины и slice был важен для получения основного значения.

В-третьих, создайте const dict в javascript и скройте / покажите указанный контент.

Вот мой шаблон:

{% block content %}
{% if form.errors %}
    {% for field in form %}
        {% for error in field.errors %}
            <div class="alert alert-danger">
                <strong>{{ field.name }} Field: {{ error|escape }}</strong>
            </div>
        {% endfor %}
    {% endfor %}
    {% for error in form.non_field_errors %}
        <div class="alert alert-danger">
            <strong>{{ error|escape }}</strong>
        </div>
    {% endfor %}
{% endif %}
<div class="container">

  <script type="text/javascript">

    function showmethod(id) {
        const dict = {
          1: ["1.1","1.4"],
          2: ["2.2"],
          10: ["10.4"],
          11: ["11.1"]
        };
        const arr = dict[id];
        const principle = ["1","2","10","11"];

        for (var k = 0; k < principle.length; k++) {
          if (principle[k] != id) {
            var arr2 = dict[principle[k]];
            for (var j = 0; j < arr2.length; j++) {
              if (document.getElementById(arr2[j])) {
                document.getElementById(arr2[j]).style.display = 'none';
                if (document.getElementById(arr2[j]).checked) {
                  document.getElementById(arr2[j]).checked = false;
                }
              }
            }
          }
        }   

        if (document.getElementById(id).checked) {
          for (var i = 0; i < arr.length; i++) {
            document.getElementById(arr[i]).style.display = 'contents';
            document.getElementById("div").style.display = 'contents';
          }
        }
    }

  </script>



  <form class="mt-3" method="post" name="method-form" id="method-form">
  {% csrf_token %}
    <div class="col col-md-12" style="padding-left: 0px;">
      {% for value, name in form.fields.principle.choices %}
        {% if value in dics.keys %}
          {% if form.principle.value == value %} 
            <div class="btn custom-btn" name="principle">
              <input type="radio" onclick="javascript:showmethod(value);" id="{{ value }}" name="principle" value="{{ value }}" checked>
              <label for="{{ value }}"><b>Principle {{ value }}</b><br><br>{{ name }}</label>
            </div>
          {% else %}
            <div class="btn custom-btn" name="principle">
              <input type="radio" onclick="javascript:showmethod(value);" id="{{ value }}" name="principle" value="{{ value }}">
              <label for="{{ value }}"><b>Principle {{ value }}</b><br><br>{{ name }}</label>
            </div>
          {% endif %}
        {% else %}
          <div class="btn custom-btn" name="principle">
            <input type="radio" onclick="javascript:showmethod(value);" id="{{ value }}" name="principle" value="{{ value }}" disabled>
            <label for="{{ value }}"><b>Principle {{ value }}</b><br><br>{{ name }}</label>
          </div>
        {% endif %}
      {% endfor %}
    </div>
    <br>
    <div class="col col-md-12" id="div" style="display:none">
      {% for value, name in form.fields.method.choices %}
          {% for keys, val in dics.items %}
            {% if value|length > 3 %}
              {% if value|slice:2 == keys %}
                {% if value in val %}
                  {% if form.method.value == value %}
                    <div class="btn custom-btn" id="{{ value }}" name="method" style="display:none">
                      <input type="radio" id="method_{{ value }}" name="method" value="{{ value }}" checked>
                      <label for="method_{{ value }}"><b>Method {{ value }}</b><br><br>{{ name }}</label>
                    </div>
                  {% else %}
                    <div class="btn custom-btn" id="{{ value }}" name="method" style="display:none">
                      <input type="radio" id="method_{{ value }}" name="method" value="{{ value }}">
                      <label for="method_{{ value }}"><b>Method {{ value }}</b><br><br>{{ name }}</label>
                    </div>
                  {% endif %}
                {% else %}
                  <div class="btn custom-btn" id="{{ value }}" name="method" style="display:none">
                    <input type="radio" id="method_{{ value }}" name="method" value="{{ value }}" disabled>
                    <label for="method_{{ value }}"><b>Method {{ value }}</b><br><br>{{ name }}</label>
                  </div>
                {% endif %}
              {% endif %}
            {% else %}
              {% if value|slice:1 == keys %}
                {% if value in val %}
                  {% if form.method.value == value %}
                    <div class="btn custom-btn" id="{{ value }}" name="method" style="display:none">
                      <input type="radio" id="method_{{ value }}" name="method" value="{{ value }}" checked>
                      <label for="method_{{ value }}"><b>Method {{ value }}</b><br><br>{{ name }}</label>
                    </div>
                  {% else %}
                    <div class="btn custom-btn" id="{{ value }}" name="method" style="display:none">
                      <input type="radio" id="method_{{ value }}" name="method" value="{{ value }}">
                      <label for="method_{{ value }}"><b>Method {{ value }}</b><br><br>{{ name }}</label>
                    </div>
                  {% endif %}
                {% else %}
                  <div class="btn custom-btn" id="{{ value }}" name="method" style="display:none">
                    <input type="radio" id="method_{{ value }}" name="method" value="{{ value }}" disabled>
                    <label for="method_{{ value }}"><b>Method {{ value }}</b><br><br>{{ name }}</label>
                  </div>
                {% endif %}
              {% endif %}
            {% endif %}     
          {% endfor %}
      {% endfor %}
    </div>
    <div class="col-md-6">
        <div class="well">
          <button class="btn btn-primary float-right" type="submit">Weiter</button>
    </div>
  </form>
</div>


{% endblock %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...