【问题标题】:How to concisely represent if/else to specify CSS classes in Django templates如何简洁地表示 if/else 以在 Django 模板中指定 CSS 类
【发布时间】:2011-04-07 16:31:13
【问题描述】:

在 Django 模板中,我想根据某些“条件”将 CSS 类添加到 DIV,例如:

<div class="pkg-buildinfo 
            {% if v.release.version == pkg.b.release.version %}active{% else %}inactive{% endif %} 
            {% if v.release.version == project.latest.version %}latest{% else %}notlatest{% endif %}">

注意 v 是一个循环变量;整个事情都在一个 for 循环内)

上面基于两个条件添加了 CSS 类“active”或“inactive”和“latest”或“notlatest”。

然而,这很难阅读和冗长。我发现with statement 不支持赋值表达式/条件(相对于复杂变量),这很遗憾。有没有更好的方法来做到这一点?

【问题讨论】:

  • @jammon - 感谢您的编辑,但是 - HTML 属性值是否支持多行字符串?
  • 哦,好点子!我必须查一下。

标签: python django django-templates


【解决方案1】:

自定义过滤器可能是一个不错的选择。

@register.filter
def active_class(obj, pkg):
    if obj.release.version == pkg.b.release.version:
         return 'active'
    else:
        return 'inactive'

并在您的模板中使用它:

<div class="pkg-buildinfo {{ obj|active_class:pkg }}" 

【讨论】:

  • 一年后阅读我的代码时可能会感到惊讶(“需要查看视图和模板以外的地方?” ...“为什么'active_class'不是@的方法987654323@ class?"),但其他方面都不错。
【解决方案2】:

你可以用 with 语句把它缩短一点:

{% with v.release.version as version %}
<div class="pkg-buildinfo 
            {% if version == pkg.b.release.version %}active{% else %}inactive{% endif %} 
            {% if version == project.latest.version %}latest{% else %}notlatest{% endif %}">
{% endwith %}

但将这种逻辑放入视图中肯定会更好:

context_data = {
    'class_active': v.release.version == pkg.b.release.version and "active" or "inactive",
    'class_latest': v.release.version == project.latest.version and "latest" or "notlatest",
    ... }

在模板中:

<div class="pkg-buildinfo {{ class_active }} {{ class_latest }}"

【讨论】:

  • 那必须是 v.class_active(v 是一个循环变量)而不是 class_active。
【解决方案3】:

您可以改为将该逻辑放入您的视图中,并在对象上创建“活动”或“非活动”等属性。然后您只需访问模板中的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2022-01-25
    相关资源
    最近更新 更多