AlexW
AlexW

Reputation: 2587

python, django, sending data to a template

EDIT: Updated code, im trying to create a new nested dictionary from the orginal results. however the dictionary is currently not updating, its only adding/editing the last value

so my current context just has greg on it and no one else

my current code is as below

# 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)

sample data would be

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, your current solution gives me the below, i think i need nested lists? as the level 2 engineer gets posted twice instead of level 1 and level 2, also missing the policy names for each one

#!/usr/bin/python
# -*- coding: utf-8 -*-
{'policies': [{
    'strStartTime': '09:00AM',
    'strEndTime': '09:00AM',
    'strLevel': 2,
    'strUserMobile': u'01234 5678',
    'strEndDate': 'Monday 02 May',
    'strUsername': u'John Smith',
    'strStartDate': 'Monday 25 April',
    }, {
    'strStartTime': '09:00AM',
    'strEndTime': '09:00AM',
    'strLevel': 2,
    'strUserMobile': u'01234 5678'',
    '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',
    }]}

Upvotes: 0

Views: 78

Answers (2)

alioguzhan
alioguzhan

Reputation: 7917

Just expanding my comment above with how to use the data in template:

You can send your data within render:

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

Then, in your template file, you can do something like this:

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

UPDATE

According to the your last update to the question;

You said,

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

This is right, because you don't have an array contains your policy objects. You only set the last value in the loop to the dictionary. This is why you are getting only last object.

This should do the work;

# 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)

Now you can do anything you want with this array inside a for loop in template. (see my above example)

Upvotes: 1

beCurious
beCurious

Reputation: 152

I think, this question is not good.

there are many kind of solution for your goal. even, django documents.

this is just sample.

        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)

Upvotes: 0

Related Questions