【问题标题】:Is there a clean way to lower the cyclomatic complexity of Django templates?有没有一种干净的方法来降低 Django 模板的圈复杂度?
【发布时间】:2022-01-03 08:34:28
【问题描述】:

我正在处理一个 Django 模板,该模板接受一个具有多个属性的对象,并根据这些属性添加不同的标签。例如,如果object.bold == True 添加<b></b> 标签,如果object.strikethrough == True 添加<strike></strike> 标签。我看过其他一些闻起来建议嵌套 if 的帖子,例如:

{% for object in objects %}
    {% if object.bold == True %}
        {% if object.strikethrough == True %}
            <b><strike>{{object.name}}</strike></b>
        {% else %}
            <b>{{object.name}}</b>
        {% endif %}
    {% else %}
        {% if object.strikethrough==True %}
            <strike>{{object.name}}</strike>
        {% else %}
            {{object.name}}
        {% endif %}
    {% endif %}
{% endfor %}

这段代码伤害了我。我还看到了一些仅在if 语句中包装开始标签的奇怪逻辑。同样,引入控制台错误很痛苦。

有没有更好、更简洁的方法可以在不嵌套 if 的情况下实现此结果?我倾向于制作一个自定义 Django 标签,但这对于我真正希望可以更简单的东西来说似乎有点过分了。

【问题讨论】:

标签: django django-templates


【解决方案1】:

另一种可能性是只使用 css 类,例如

css-文件:

.myboldTrue {
  font-weight: bold;
}

.mystrikethroughTrue {
  text-decoration: line-through;
}

html-文件:

{% for object in objects %}
    <span class="mybold{{ object.bold }} mystriketrough{{ object.strikethrough }}"> {{object.name}} </span>
{% endfor %}

【讨论】:

    【解决方案2】:

    我最终编写了一个效果很好的自定义装饰器。

    myapp/templates/my_template.html 我有一些看起来像这样的东西:

    {% load decorator_tags.py %}
    {% for object in objects %}
        {% get_decorators object as result %}
        {{ result }}
    {% endfor %}
    

    然后在myapp/templatetags/get_decorators.py 我有一些看起来像这样的东西:

    from django import template
    from django.utils.safestring import mark_safe
    
    register = template.Library()
    
    @register.simple_tag(name='get_decorators')
    def get_decorators(object):
        prepend_string = ''
        append_string = ''
        if object.bold:
            prepend_string = '<b>' + prepend_string
            append_string = append_string + '</b>'
        if object.strikethrough:
            prepend_string = '<strike>' + prepend_string
            append_string = append_string + '</strike>'
        
        return mark_safe(prepend_string + object.name + append_string)
    

    尽管它的代码要多得多,但感觉更干净,坚持使用 Django 而不是使用任何花哨的 HTML 或 CSS,使我的模板保持精简,并且可重用。我可能可以清理get_decorators 逻辑,但我现在可以通过最少的代码更改来做到这一点。

    我花了一点时间才解决所有问题,所以我想我在这里发布这个,以防其他人遇到同样的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多