2014-02-16 10 views
1

Я пытаюсь получить доступ к некоторым данным в шаблоне. Я не думаю, что способ, которым я сейчас занимаюсь, это лучший способ, но я не могу заставить его работать даже наполовину.Django dict в шаблоне

def room(request, room_id): 
     #get room data 
     room = Room.objects.filter(id=room_id).get() 
     modules = [] 
     #pull all actuator devices for the room 
     actuators = Device.objects.filter(room_id=room_id,type="actuator") 
     #build a list of modules then use set to remove duplicates 
     for actuator in actuators.values(): 
       module = Module.objects.get(module_id=actuator["module_id"]).name_only() 
       modules.extend([module]) 
     modlist = list(set(modules)) 
     moduleData = {} 
     #loop through the modules, pull out the required data and send it all off to the template 
     for module in modlist: 
       data = Module_List.objects.get(name=module) 
       dict = {"name": data.name, "widget_mqtt_js": data.widget_mqtt_js, "widget_setup_js": data.widget_setup_js, "widget_body": data.widget_body} 
       moduleData[module] = dict 
       print dict["widget_mqtt_js"] 
     context = {"room_name" : room.name, "actuators" : actuators, "modules" : moduleData} 
     return render(request, 'control/room.html', context) 

Это мой код в его нынешнем виде. Проблема, с которой я столкнулась, заключается в том, что цикл в моем шаблоне возвращается пустым. Это выглядит следующим образом:

{% for module in modules %} 
    {{module.widget_mqtt_js}} 
{% endfor %} 

Я думаю, что будет способ сделать это с моделью module_list, но я could't получить, что работает, либо ..

+1

'module' вот каждый итерация ключ' modules'. Используйте '{% для module_name, module in modules.iteritems%}' для доступа к значениям. – okm

+0

@okm post ответить –

ответ

2

modules в контексте шаблона является moduleData в ваш код просмотра. Но moduleData - это dict, и итерация по dict дает свои ключи, а не их значения.

Вам нужно перебрать значения, попробуйте:

{% for module in modules.values %} 
    {{module.widget_mqtt_js}} 
{% endfor %} 
+0

сладкий, который заставил его появиться. Можете ли вы сказать мне, как остановить его от вытеснения HTML? Например, я получаю " вместо "и т. Д. – Dan

+0

@Dan Вы уверены, что это желательно? Имейте в виду, что отключение экранирования может облегчить атаки XSS. Если вы действительно знаете, что делаете, тогда вы это сделаете: '{{module.widget_mqtt_js | safe}}', используя фильтр шаблонов ['safe'] (https://docs.djangoproject.com/en/dev/ref/templates/builtins/#std:templatefilter-safe). –

+0

Спасибо @Thomas Orozco, да, я уверен, поскольку он вставляет JS, хранящийся в базе данных, как часть модуля. – Dan

Смежные вопросы