Skip to main content
 首页 » 编程设计

python之如何为 django 模板格式化数据

2025年04月02日46jpfss

这是我的数据样本:

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 

我需要以这样一种格式安排这些数据,以便我可以将其用作 django 中的模板。一开始我以为我需要嵌套字典,但这行不通,因为我需要同一个键下的多个值。

我是 Python 新手,所以如果我错了,请更正上面的内容。

编辑:

这是我得到的,

我有 Dict > list ,但不确定如何将匹配的字典放入列表中?

### Get all the Polices ### 
dictContext = {} 
for objPolicy in objPolicyData['escalation_policies']: 
    strPolicyName = objPolicy['name']    
    if strPolicyName.lower().find('test') == -1: 
        lstLevel = [] 
        dictContext[strPolicyName] = lstLevel 
        for objOnCall in objPolicy['on_call']: 
            dictUser = {} 
            lstLevel.append(objOnCall['level']) 
            dictUser['strStartDate'] =  getDate(objOnCall['start']) 
            dictUser['strStartTime'] = getTime(objOnCall['start']) 
            dictUser['strEndDate'] =  getDate(objOnCall['end']) 
            dictUser['strEndTime'] = getTime(objOnCall['end']) 
            objUser = objOnCall['user'] 
            dictUser['strUsername'] =  objUser['name'] 
            dictUser['strUserMobile'] = getUserMobile(objUser['id']) 
            #lstLevel.append(dictUser) 

结果是

{ 
    u'DBA Escalation Policy': [1], 
    u'Server Escalation Policy': [1], 
    u'Network Team Escalation Policy': [1, 2], 
    } 

所以我的下一步是让每个级别下的用户详细信息

它需要去

Policy1 > Level 1 > level 1 user details | Level 2 > Level 2 user details 
Policy2 > Level 1 > level 1 user details  
Policy3 > Level 1 > level 1 user details | Level 2 > Level 2 user details | Level 3 > Level 3 user details 

这是我的目标

谢谢

请您参考如下方法:

使用原始类型,您的数据可能会转换为如下内容:

policy = { 
    "Network": [ 
        { 
            "Name": "John Smith", 
            "Start_date": "27 April", 
            "Start_time": "8am", 
            "end_Date": "05 May", 
            "end_time": "8am" 
        }, 
        { 
            "Name": "Bob Smith", 
            "Start_date": "27 April", 
            "Start_time": "8am", 
            "end_Date": "05 May", 
            "end_time": "8am" 
        }, 
    ] 
    "Server": [ 
        # ... 
    ] 
} 

然后在django模板中,你可以引用,例如:

{% policy.Network.0.name %} 

(级别从 0 开始,所以使用 level - 1)

您还可以遍历每个策略中的级别。

要从您已有的数据结构(根据您的代码示例判断)创建此数据结构,您需要执行以下操作:

policy = {} 
 
# is there a better way here? Are we iterating a dict or a list? 
for policy_data in objPolicyData['escalation_policies']: 
    policy_name = policy_data["name"] 
 
    # this is a better approach that the find method you employed 
    if "test" in policy_name: 
        continue 
 
    def sort_key(user_data): 
        return user_data["level"] 
 
    # just using a list comprehension to map the objects from the current 
    # form to your desired form, making sure we iterate over them in 
    # level order 
    policy[policy_name] = [ 
        { 
            "name": user_data["name"] 
            "start_date": getDate(user_data['start']) 
            "start_time": getTime(user_data['start']) 
            "end_date": getDate(user_data['end']) 
            "end_time": getTime(user_data['end']) 
        } 
        for user_data in sorted(policy_data["on_call"], key=sort_key) 
    ] 

我可能会考虑让对象代表你的数据,并提供一个接口(interface)来处理 django 模板的限制,而不是使用原语,因为否则你最终会得到你的模板和你的 View 代码都紧密耦合到数据结构。