【问题标题】:Django custom template tag sort long list of 'elif'Django自定义模板标签排序长列表'elif'
【发布时间】:2021-11-03 19:58:00
【问题描述】:

我有一个 Django 自定义模板标签,它根据输入的值改变字体的颜色。

一切正常,但我想知道是否有一种更简洁的方式来编写此代码,而不是编写所有这些 elif 语句。显示的球队甚至不到一半,还有 3 个其他联赛的球队会被包含在该标签中。

@register.filter(name='teamColor')
def teamColor(team):

    if team == "Celtics" or team == "Jazz":
        return "green"
    elif (team == "Hawks" or team == "Bulls" or team == "Rockets"
          or team == "Pistons" or team == "Clippers" or team == "Heat" or
          team == "Trail Blazers" or team == "Raptors"):
        return "red"
    elif team == "Nets":
        return "grey"
    elif (team == "Hornets" or team == "Lakers" or team == "Suns" or
          team == "Kings"):
        return "purple"
    elif team == "Cavaliers":
        return "#b11226"
    elif team == "Mavericks" or team == "Grizzlies" or team == "76ers":
        return "blue"
    elif team == "Nuggets" or team == "Pacers":
        return "yellow"
    elif (team == "Warriors" or team == "Timberwolves" or team == "Thunder" or
          team == "Knicks"):
        return "#1D428A"
    elif team == "Bucks":
        return "#00471b"
    elif team == "Pelicans":
        return "gold"
    elif team == "Magic":
        return "#0077C0"
    elif team == "Spurs" or team == "Wizards":
        return "silver"

【问题讨论】:

    标签: python django templatetags


    【解决方案1】:

    只需将所有内容放入字典(查找表)。

    @register.filter(name='team_color')
    def team_color(team):
        team_colors = {
            'Celtics':  'green',
            'Jazz':     'green',
            'Hawks':    'red',
            'Bulls':    'red',
            'Rockets':  'red',
            'Pistons':  'red',
            'Clippers': 'red',
            'Heat':     'red',
            # ... etc ..
        }
        return team_colors[team]
    

    这既快速又清晰。如果团队不存在,您也可以使用return team_colors.get(team, default='no_color') 来返回默认颜色。

    【讨论】:

    • 另外,更好的方法是将这些数据像模块一样保存在.py 文件中,然后将其导入视图。 Better to keep those data in a "settings" file..
    • @Alireza 也许吧。这取决于他们的用例以及问题是否容易改变。将字典封装并内联到函数中是最快、最干净、最复杂的方法。但它不是很有活力,外部的人(比如设计师)可能很难找到和改变。但是,当/如果出现该要求时,很容易在需要时将其重构为设置文件。
    • 就是这样。我个人在纯 python 项目中使用我建议的方法。主要用于加载配置文件或类似的东西。但是 Django 可以很好地处理那些.py 文件。感谢你的回答。
    【解决方案2】:

    我建议您在 .json 文件中列出所有团队及其所需颜色,将其导入您的视图,并尝试使用以下方法捕捉颜色。

    import json
    
    def getTeamColor(team):
       with open('file.json') as file:   # file contains teams and colors
           team_colors = json.load(file)
       
       for teams in tuple(team_colors.keys()):
           if team in teams:
               return team_colors[teams]
    

    并且JSON文件应该是如下结构。

    {
        "('Celtics', 'Jazz')": "green",
        "('Hawks', 'Bulls', 'Rockets')": "red",
        "('Nets',)": "grey",
        ...
    }
    

    【讨论】:

    • 我强烈建议不要这样做。为每个请求从磁盘加载将非常缓慢,并且会引入比需要的复杂得多的复杂性。当您可以进行 O(1) 查找时,您还可以使用 O(n) 搜索团队。
    • 嗯,数据量是固定的。 (NBA 从来没有这么快就引进过一支球队)但我完全同意这一点。在 Django 中使用变量要好得多。
    猜你喜欢
    • 2021-07-13
    • 2015-01-20
    • 2012-03-15
    • 2015-12-17
    • 2011-03-27
    • 2011-03-31
    • 2011-10-05
    • 1970-01-01
    相关资源
    最近更新 更多