复杂的yesno过滤器比较?
我刚开始学习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的源代码,了解这两个标签,然后试着把它们合并成你自己的模板标签。