复杂的yesno过滤器比较?

3 投票
2 回答
2795 浏览
提问于 2025-04-17 07:49

我刚开始学习python和django。

我很喜欢django的模板,但有一个问题我总是找不到解决办法。

我经常需要在一个(可能很长的)HTML标签上添加一个条件属性。大多数情况下,这个属性是一个额外的CSS类。

比如说,假设你有两个链接用来切换语言,而你希望一次只启用一个链接。我发现自己通常会这样写:

{% get_language_info for LANGUAGE_CODE as l %}
<a href="/path/to/switch/to/spanish" 
   class="{% ifequal l.code "es" %} disable {% endifequal %}">
   <img src="/spanish/flag/url" alt="Spanish">
</a>
<a href="/path/to/switch/to/english" 
   class="{% ifequal l.code "en" %} disable {% endifequal %}">
   <img src="/english/flag/url" alt="English">
</a>

还有其他例子,比如在渲染一系列项目时,检查哪个是“选中”的等等。

在其他编程语言中,我会用三元运算符来实现这个功能,但我知道在python和django的世界里,这被认为是不好的做法 :-)

我在想是否可以利用“yesno”过滤器。我尝试过这样做:

{{l.code=="es"|yesno:"disabled,"}}

但我没能成功……我是不是漏掉了什么?

提前谢谢你。

2 个回答

0

或者你可以用 jQuery 或者 JavaScript 来设置类名:http://api.jquery.com/attr/,可以像这样做——不过这个代码没有经过测试!

{% get_language_info for LANGUAGE_CODE as l %}

<script>
{% if l.code='es' %}
  $('.english').attr('class','disable');
{% else %}
  $('.english').attr('class','disable');
{% endif %}
</script>



<a href="/path/to/switch/to/spanish" 
   id="spanish" class='enable">
   <img src="/spanish/flag/url" alt="Spanish" >
</a>
<a href="/path/to/switch/to/english" 
   id="english" class='enable">
   <img src="/english/flag/url" alt="English">
</a>
4

问题出在你发布的代码语法上:

{{l.code=="es"|yesno:"disabled,"}}

实际上,它是这样被处理的:

{{ l.code=={{"es"|yesno:"disabled,"}} }}

(注意:这段代码是不能运行的,只是用来说明Django是怎么理解它的)

你想要的是一个自定义的模板标签,它的功能类似于if标签,但返回的结果像yesno过滤器那样。你可以在djangosnippets.com上搜索一下,也许有人已经为你做了这个工作。如果没有的话,我建议你看看Django的源代码,了解这两个标签,然后试着把它们合并成你自己的模板标签。

撰写回答