Django-MySQL, 5 динамически зависимых выпадающих списков с использованием только одной модели - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть поле поиска, где у меня есть 5 выпадающих меню, которые помогут мне отфильтровать результаты поиска.В моей базе данных (MySQL) у меня есть одна модель Equip с 21 столбцом, которая является единственной моделью, используемой в параметрах поиска.Мне нужно только использовать 5 из 21 столбца, чтобы получить необходимые результаты, это: eqtype, eqmfg, eqeff, eqmfgmodeldescrip и eqconfig.

Первый выпадающий список - это фильтр по eqtype, а второй - фильтр по eqmfgтретий - eqeff, четвертый - eqmfgmodeldescrip, пятый - eqconfig.Как я уже написал, они возвращают все опции для своих уважаемых полей.Тем не менее, я пытаюсь установить второй раскрывающийся список динамически, что означает, что в зависимости от первого раскрывающегося списка (eqtype) во втором раскрывающемся списке должны отображаться только те eqmfg, которые соответствуют соответствующему выбранному типу eqtype.Третий будет основан на первом и втором выборе.Четвертый будет основан на первом, втором и третьем выборе.Пятый будет основан на первом, втором, третьем и четвертом выборе.

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

Спасибо за помощь!

Мой код для выпадающего списка следующий:

model.py

class Equip(models.Model):
    eqtype = models.CharField(max_length=45, blank=True,  verbose_name="Type:")
    eqmfg = models.CharField(max_length=45, blank=True, verbose_name="Mfg:")
    eqconfig = models.CharField(max_length=45, blank=True, verbose_name="Config.:")
    eqeff = models.CharField(max_length=45, blank=True, verbose_name="Efficiency:")
    eqmfgmodeldescrip = models.CharField(max_length=445, blank=True, verbose_name="Mfg. Model Descrip.:")


def get_absolute_url(self):
    return f"/login/equip_detail/{self.id}/"

Views.py

def search2(request):
    queryset = Equip.objects.all()
    search_term = ''
    count = ''
    search1 = ''

if 'search1' in request.GET:
    search_term = request.GET['search1']
    queryset = queryset.filter(Q(eqmodel__icontains=search_term)
                               | Q(eqmfg__icontains=search_term)
                               | Q(eqtype__icontains=search_term)
                               | Q(eqconfig__icontains=search_term)
                               | Q(eqmfgmodeldescrip__icontains=search_term)
                               | Q(eqmtrtype__icontains=search_term)
                               | Q(eqeff__icontains=search_term)
                               | Q(eqbtu__icontains=search_term)
                               | Q(eqprice__icontains=search_term))

    count = queryset.filter(Q(eqmodel__icontains=search_term)
                            | Q(eqmfg__icontains=search_term)
                            | Q(eqtype__icontains=search_term)
                            | Q(eqconfig__icontains=search_term)
                            | Q(eqmfgmodeldescrip__icontains=search_term)
                            | Q(eqmtrtype__icontains=search_term)
                            | Q(eqeff__icontains=search_term)
                            | Q(eqbtu__icontains=search_term)
                            | Q(eqprice__icontains=search_term)).count()

type1 = Equip.objects.order_by('eqtype').values('eqtype').distinct().exclude(eqtype='None')

if 'search2' in request.GET:
    search_term = request.GET['search2']
    queryset = queryset.filter(Q(eqmodel__icontains=search_term)
                               | Q(eqmfg__icontains=search_term)
                               | Q(eqtype__icontains=search_term)
                               | Q(eqconfig__icontains=search_term)
                               | Q(eqmfgmodeldescrip__icontains=search_term)
                               | Q(eqmtrtype__icontains=search_term)
                               | Q(eqeff__icontains=search_term)
                               | Q(eqbtu__icontains=search_term)
                               | Q(eqprice__icontains=search_term))

    count = queryset.filter(Q(eqmodel__icontains=search_term)
                            | Q(eqmfg__icontains=search_term)
                            | Q(eqtype__icontains=search_term)
                            | Q(eqconfig__icontains=search_term)
                            | Q(eqmfgmodeldescrip__icontains=search_term)
                            | Q(eqmtrtype__icontains=search_term)
                            | Q(eqeff__icontains=search_term)
                            | Q(eqbtu__icontains=search_term)
                            | Q(eqprice__icontains=search_term)).count()

mfg1 = Equip.objects.order_by('eqmfg').values('eqmfg').distinct().exclude(eqmfg='None')

if 'search3' in request.GET:
    search_term = request.GET['search3']
    queryset = queryset.filter(Q(eqmodel__icontains=search_term)
                               | Q(eqmfg__icontains=search_term)
                               | Q(eqtype__icontains=search_term)
                               | Q(eqconfig__icontains=search_term)
                               | Q(eqmfgmodeldescrip__icontains=search_term)
                               | Q(eqmtrtype__icontains=search_term)
                               | Q(eqeff__icontains=search_term)
                               | Q(eqbtu__icontains=search_term)
                               | Q(eqprice__icontains=search_term))

    count = queryset.filter(Q(eqmodel__icontains=search_term)
                            | Q(eqmfg__icontains=search_term)
                            | Q(eqtype__icontains=search_term)
                            | Q(eqconfig__icontains=search_term)
                            | Q(eqmfgmodeldescrip__icontains=search_term)
                            | Q(eqmtrtype__icontains=search_term)
                            | Q(eqeff__icontains=search_term)
                            | Q(eqbtu__icontains=search_term)
                            | Q(eqprice__icontains=search_term)).count()

eff1 = Equip.objects.order_by('eqeff').values('eqeff').distinct().exclude(eqeff='None')


if 'search4' in request.GET:
    search_term = request.GET['search4']
    queryset = queryset.filter(Q(eqmodel__icontains=search_term)
                               | Q(eqmfg__icontains=search_term)
                               | Q(eqtype__icontains=search_term)
                               | Q(eqconfig__icontains=search_term)
                               | Q(eqmfgmodeldescrip__icontains=search_term)
                               | Q(eqmtrtype__icontains=search_term)
                               | Q(eqeff__icontains=search_term)
                               | Q(eqbtu__icontains=search_term)
                               | Q(eqprice__icontains=search_term))

    count = queryset.filter(Q(eqmodel__icontains=search_term)
                            | Q(eqmfg__icontains=search_term)
                            | Q(eqtype__icontains=search_term)
                            | Q(eqconfig__icontains=search_term)
                            | Q(eqmfgmodeldescrip__icontains=search_term)
                            | Q(eqmtrtype__icontains=search_term)
                            | Q(eqeff__icontains=search_term)
                            | Q(eqbtu__icontains=search_term)
                            | Q(eqprice__icontains=search_term)).count()

moddescrip1= Equip.objects.order_by('eqmfgmodeldescrip').values('eqmfgmodeldescrip').distinct()

if 'search5' in request.GET:
    search_term = request.GET['search5']
    queryset = queryset.filter(Q(eqmodel__icontains=search_term)
                               | Q(eqmfg__icontains=search_term)
                               | Q(eqtype__icontains=search_term)
                               | Q(eqconfig__icontains=search_term)
                               | Q(eqmfgmodeldescrip__icontains=search_term)
                               | Q(eqmtrtype__icontains=search_term)
                               | Q(eqeff__icontains=search_term)
                               | Q(eqbtu__icontains=search_term)
                               | Q(eqprice__icontains=search_term))

    count = queryset.filter(Q(eqmodel__icontains=search_term)
                            | Q(eqmfg__icontains=search_term)
                            | Q(eqtype__icontains=search_term)
                            | Q(eqconfig__icontains=search_term)
                            | Q(eqmfgmodeldescrip__icontains=search_term)
                            | Q(eqmtrtype__icontains=search_term)
                            | Q(eqeff__icontains=search_term)
                            | Q(eqbtu__icontains=search_term)
                            | Q(eqprice__icontains=search_term)).count()
config1 = Equip.objects.order_by('eqconfig').values('eqconfig').distinct().exclude(eqconfig='None')

context = {"object_list1": queryset,
           "search_term": search_term,
           "count": count,
           "queryset1": queryset,
           "search1": search1,
           "type1": type1,
           "mfg1": mfg1,
           "eff1": eff1,
           "moddescrip1": moddescrip1,
           "config1": config1,


           }

return render(request, 'login/search2.html', context)

search2 HTML:

<div class="s008">
  <form>
    <div class="inner-form">
      <div class="advance-search">
          <span class="desc">Search</span>
        <div class="row">
          <div class="input-field">
            <div class="input-select">
              <select data-trigger="" name="search1" id="eqtype" onchange="return showfields();">
                <option placeholder="" value="{{ type2.eqtype }}">EQUIPMENT TYPE</option>
                  {% for type1 in type1 %}
                  <option value="{{ type1.eqtype }}">{{ type1.eqtype }}</option>
                  {% endfor %}
              </select>
            </div>
          </div>
          <div id="Man" class="input-field" style="visibility: hidden;">
            <div class="input-select">
              <select data-trigger="" name="search2" id="eqmfg" onchange="return Eff.style.visibility = 'visible'">
                <option placeholder="" value="{{ type3.eqmfg }}">MANUFACTURER</option>
                  {% for mfg1 in mfg1 %}
                  <option value="{{ mfg1.eqmfg }}">{{ mfg1.eqmfg }}</option>
                  {% endfor %}
              </select>
            </div>
          </div>
          <div id="Eff" class="input-field" style="visibility: hidden;">
            <div class="input-select">
              <select data-trigger="" name="search3" id="eqeff" onchange="return Mod.style.visibility = 'visible'">
                <option placeholder="" value="{{ type4.eqeff }}">EFFICIENCY</option>
                  {% for eff1 in eff1 %}
                  <option value="{{ eff1.eqeff }}">{{ eff1.eqeff }}</option>
                  {% endfor %}
              </select>
            </div>
          </div>
        </div>
        <div class="row second">
          <div id="Mod" class="input-field" style="visibility: hidden;">
            <div class="input-select">
              <select data-trigger="" name="search4" id="eqmfgmodeldescrip" onchange="return Config.style.visibility = 'visible'">
                <option placeholder="" value="{{ type5.eqmfgmodeldescrip }}">MODEL DESCRIPTION</option>
                  {% for moddescrip1 in moddescrip1 %}
                  <option value="{{ moddescrip1.eqmfgmodeldescrip }}">{{ moddescrip1.eqmfgmodeldescrip }}</option>
                  {% endfor %}
              </select>
            </div>
          </div>
          <div id="Config" class="input-field" style="visibility: hidden;">
            <div class="input-select">
              <select data-trigger="" name="search5"id="eqconfig">
                <option placeholder="" value="">CONFIGURATION</option>
                   {% for config1 in config1 %}
                  <option value="{{ config1.eqconfig }}">{{ config1.eqconfig }}</option>
                  {% endfor %}
              </select>
            </div>
          </div>
        </div>
        <div class="row third">
          <div class="input-field">
            <div class="result-count">
                <p> results : <span>{{ count }}</span></p>
            </div>
              <div id="Button" class="group-btn" style="visibility: hidden;">
                  <a class="btn-delete" href="/login/search2">Reset</a>
                  <button class="btn-search">Search</button>
              </div>
          </div>
        </div>
      </div>
    </div>
  </form>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...