2016-04-27 2 views
0

EDIT: Обновлен код, im пытается создать новый вложенный словарь из исходных результатов. однако словарь в настоящее время не обновляется, его только добавление/редактирование последнего значенияpython, django, отправка данных в шаблон

поэтому мой текущий контекст просто имеет Грега на него, и никто другой

мой текущий код, как показано ниже

# Create your views here. 
def index(request): 
    ### Get all the Polices ### 
    context = {} 
    for objPolicy in objPolicyData['escalation_policies']: 
     strPolicyName = objPolicy['name'] 
     if strPolicyName.lower().find('test') == -1: 
      context['strPolicyName'] = strPolicyName 
      obj = {} 
      for objOnCall in objPolicy['on_call']: 
       obj['strLevel'] = objOnCall['level'] 
       obj['strStartDate'] = getDate(objOnCall['start']) 
       obj['strStartTime'] = getTime(objOnCall['start']) 
       obj['strEndDate'] = getDate(objOnCall['end']) 
       obj['strEndTime'] = getTime(objOnCall['end']) 
       objUser = objOnCall['user'] 
       obj['strUsername'] = objUser['name'] 
       obj['strUserMobile'] = getUserMobile(objUser['id']) 
       context['objUsers'] = obj 
return render(request, 'oncall/rota.html', context) 

выборочные данные будут

Network Policy 
    Level 1: John Smith 
    Start date: 27 April 
    Start time: 8am 
    end Date: 05 May 
    end time: 8am 
    Level 2: Bob Smith 
    Start date: 27 April 
    Start time: 8am 
    end Date: 05 May 
    end time: 8am 
Server Policy 
    Level 1: Jane Doe 
    Start date: 23 April 
    Start time: 8am 
    end Date: 02 May 
    end time: 8am 
    Level 2: Greg Brad 
    Start date: 23 April 
    Start time: 8am 
    end Date: 02 May 
    end time: 8am 
and so on...  

Update:

@Alix, ваше текущее решение дает мне ниже, я думаю, мне нужны вложенные списки? как инженер 2-го уровня будет размещена в два раза, а не уровня 1 и уровня 2, также отсутствуют имена политики для каждого одного

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
{'policies': [{ 
    'strStartTime': '09:00AM', 
    'strEndTime': '09:00AM', 
    'strLevel': 2, 
    'strUserMobile': u'', 
    'strEndDate': 'Monday 02 May', 
    'strUsername': u'John Smith', 
    'strStartDate': 'Monday 25 April', 
    }, { 
    'strStartTime': '09:00AM', 
    'strEndTime': '09:00AM', 
    'strLevel': 2, 
    'strUserMobile': u''', 
    'strEndDate': 'Monday 02 May', 
    'strUsername': u'John Smith', 
    'strStartDate': 'Monday 25 April', 
    }, { 
    'strStartTime': '09:00AM', 
    'strEndTime': '05:00PM', 
    'strLevel': 1, 
    'strUserMobile': u'011151588', 
    'strEndDate': 'Thursday 28 April', 
    'strUsername': u'Jane Doe', 
    'strStartDate': 'Thursday 28 April', 
    }, { 
    'strStartTime': '05:00PM', 
    'strEndTime': '03:30PM', 
    'strLevel': 1, 
    'strUserMobile': 'User does not have a company phone no', 
    'strEndDate': 'Thursday 28 April', 
    'strUsername': u'Fred Perry', 
    'strStartDate': 'Wednesday 27 April', 
    }, { 
    'strStartTime': '09:00AM', 
    'strEndTime': '07:00AM', 
    'strLevel': 1, 
    'strUserMobile': 'User does not have a company phone no', 
    'strEndDate': 'Tuesday 03 May', 
    'strUsername': u'Sally Cinomon', 
    'strStartDate': 'Monday 25 April', 
    }]} 
+0

просто отправьте его в пределах вызова рендеринга. как 'return render (запрос,« oncall/rota.html », {" policy ": objPolicyData})' – alix

+1

@alix почему бы не поместить в ans? –

+0

думал, что это просто. должен ли я это сделать? @RajaSimon – alix

ответ

1

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

Вы можете отправить свои данные в render:

return render(request, "oncall/rota.html", {"policies": objPolicyData['escalation_policies']) 

Затем в файле шаблона, вы можете сделать что-то вроде этого:

{% for policy in policies %} 
    {% for objOnCall in policy.on_call %} 
     <p> Level: {{ objOnCall.level }} </p> 
     <p> Start Time: {{ objOnCall.start }} </p> 
    {% endfor %} 
{% endfor %} 

UPDATE

Согласно вашему последнему обновлению на вопрос;

Вы сказали,

however the dictionary is currently not updating, its only adding/editing the last value

Это правильно, потому что вы не имеете массив содержит ваши объекты политики. Вы только устанавливаете последнее значение в цикле словаря. Вот почему вы получаете только последний объект.

Это должно делать работу;

# Create your views here. 
def index(request): 
    ### Get all the Polices ### 
    policies = [] 
    for objPolicy in objPolicyData['escalation_policies']: 
     strPolicyName = objPolicy['name'] 
     policy = {} 
     policy['name'] = strPolicyName 
     if strPolicyName.lower().find('test') == -1: 
      policy = {} 
      policy['strPolicyName'] = strPolicyName # add policy name here 
      policy['objUsers'] = [] # define an empty array for users 
      for objOnCall in objPolicy['on_call']: 
       obj['strLevel'] = objOnCall['level'] 
       obj['strStartDate'] = getDate(objOnCall['start']) 
       obj['strStartTime'] = getTime(objOnCall['start']) 
       obj['strEndDate'] = getDate(objOnCall['end']) 
       obj['strEndTime'] = getTime(objOnCall['end']) 
       objUser = objOnCall['user'] 
       obj['strUsername'] = objUser['name'] 
       obj['strUserMobile'] = getUserMobile(objUser['id']) 
       policy['objUsers'].append(obj) # add each user to the users array belongs to this policy object 

     policies.append(policy) # and finally append final and prepared policy object to our main policies array. 

    context = {"policies": policies} 
    return render(request, 'oncall/rota.html', context) 

Теперь вы можете делать все, что вы хотите с этим массивом внутри for loop в шаблоне. (см. мой вышеприведенный пример)

+0

, как указано выше, не разумно ли предварительно форматировать и уменьшать данные перед отправкой в ​​шаблон? У меня есть некоторые функции, которые я запускаю, которые делают форматирование и так далее, прежде чем отправлять данные – AlexW

+0

@AlexW Но я не знаю, сколько и какие части ваших данных вам понадобятся. я просто показал, как вы можете передавать словари и использовать их в шаблонах. в моем примере я отправил 'objPolicyData ['escalation_policies']'. вы можете отправить все, что захотите. если словарь действителен, вам не нужно предварительно форматировать его. просто используйте их, поскольку они находятся в шаблоне. Django позволяет это. – alix

+0

Я думаю, что они спрашивают, как создать новый словарь из моих строк, если это имеет смысл? – AlexW

0

Я думаю, этот вопрос не является хорошим.

есть много вариантов решения для вашей цели. даже, документы django.

это только образец.

 context = dict() 
     for objOnCall in objPolicy['on_call']: 
      obj = dict() 
      obj['strLevel'] = objOnCall['level'] 
      obj['strStartDate'] = getDate(objOnCall['start']) 
      obj['strStartTime'] = getTime(objOnCall['start']) 
      obj['strEndDate'] = getDate(objOnCall['end']) 
      obj['strEndTime'] = getTime(objOnCall['end']) 
      obj['objUser'] = objOnCall['user'] 
      obj['strUsername'] = objUser['name'] 
      obj['strUserMobile'] = getUserMobile(objUser['id']) 
      context[objUser['name']] = obj 
return render(request, 'oncall/rota.html', context) 
+0

извините, я новичок в django и python, поэтому не знаю, как полностью спросить, что им еще предстоит сделать, этот код дает контекст ошибки [objUser ['name'] = obj ^ SyntaxError: недействительный синтаксис – AlexW

+0

sorry , у меня есть ошибка. 'context [objUser ['name'] = obj' означает' context [objUser ['name']] = obj ' – beCurious

+0

Сетевая политика имеет 2-го уровня bob-smith в два раза при тестировании, я думаю, что второй над первым записывает, если вы понимаете, о чем я? – AlexW