шаблон django: получить значение словаря на основе ключа, равного значению определенного тега - PullRequest
0 голосов
/ 09 марта 2012

Я очень плохо знаком с веб-разработкой и знаю, что это может быть глупым подходом, но не могу придумать лучшего способа сделать это. В views.py метод возвращает словарь с именем sniffer_aps в шаблон в следующем формате:

sniffer_aps = {device1:[ap1, ap2], device2:[ap3, ap4, ap5], ......}

В шаблоне у меня есть выпадающий список, в котором перечислены все устройства (device1, device2, ......).

В другом поле я перечисляю все aps, принадлежащие устройству, выбранному в раскрывающемся списке. Я хочу динамически настраивать поле в соответствии с выбранным устройством, но на самом деле это не работает.

Код раскрывающегося списка:

<select onchange="refresh(this.value)" id="sniffer_list">
            {% for sniffer_ap in sniffer_aps %}
                <option value={{ sniffer_ap }}>{{ sniffer_ap.plug_ip }}</option>
            {% endfor %}
</select>

Мой вопрос заключается в том, как я могу зациклить значение в поле, которое показывает aps, на основе параметра, выбранного в раскрывающемся списке?

Прямо сейчас мой подход состоит в том, чтобы использовать javascript для обнаружения события "onchange" в раскрывающемся списке и изменить значение поля, в котором перечислены все aps соответственно, затем просто получить значение поля и рассматривать его как ключ словарь.

function refresh(key) {
        $('.router').attr('value') = key;
}

Для поля со списком aps проблема именно в этом. Я пытаюсь добиться чего-то вроде этого:

<select multiple="multiple" size="6">
                {% for router in sniffer_aps[this.value] %}
                    <option class="router" value="">{{ router }}</option>
                {% endfor %}
</select>

Пожалуйста, исправьте мой подход, или если кто-то может предоставить лучший способ. Большое спасибо.

1 Ответ

2 голосов
/ 09 марта 2012

У вас возникают проблемы, потому что вы путаете код на стороне сервера (движок шаблонов Django) с кодом на стороне клиента (код Javascript, который вы используете для обработчика onchange).Ваш серверный код будет работать на сервере до того, как полученный HTML будет доставлен клиенту, поэтому вы не можете взаимодействовать между Javascript и клиентской логикой шаблона.

Вы правыиспользовать Javascript и событие onchange для обновления значений в поле со списком приложений - вы можете сделать это на сервере, отправив форму и изменив HTML с помощью Django, когда будет возвращен новый запрос, но это требует новой загрузки веб-страницы и не так быстро и не удобно для пользователя, как это делается с Javascript.

Я бы подошел к этому следующим образом:

  1. Преобразованиесловарь для JSON в вашем классе представления Django:

    import json
    ...
    sniffer_app_json = json.dumps(sniffer_apps)
    
  2. Вывод JSON в виде объекта JavaScript в коде вашего шаблона:

    var snifferApps = {{ sniffer_apps_json }};
    
  3. Использование JavaScript для обновления поля приложений, используя эти данные.Есть много вопросов адресации this в StackOverflow - вы можете рассмотреть возможность использования jQuery, поскольку это значительно упрощает манипуляции такого рода.1031 *

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