如果不是null,则更改

时间:2013-07-26 21:15:26

标签: django

我的模板中有以下逻辑:

{% for task in tasks %}
    {% ifchanged task.shared_task_id %}
        <tr>{{ task }}</tr>
    {% endifchanged %}
{% endfor %}

但是,如果ifchanged为无,我想忽略shared_task_id标记。类似的东西:

{% ifchanged task.shared_task_id or if task.shared_task_id == None %}
    <tr>{{ task }}</tr>
{% endifchanged %}

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:0)

我现在正在模特中以一种黑客的方式做到这一点:

{% ifchanged task.shared_task_id_or_random %}

# models.py
def shared_task_id_or_random(self):
    return self.shared_task_id or str(random.random())

关于如何解决这个问题的更好的想法?

答案 1 :(得分:0)

由于and中没有or{% ifchange %}逻辑,因此您可以随时使用2 if block来实现您的目标:

{% for task in tasks %}
    {% ifchanged task.shared_task_id %}
        <tr>{{ task }}</tr>
    {% else %}
        {% if task.shared_task_id == None %}
            <tr>{{ task }}</tr>
        {% endif %}
    {% endifchanged %}
{% endfor %}

答案 2 :(得分:0)

试试这个(用Hieu的修复编辑):

{% ifchanged task.shared_task_id %}
    <tr>{{ task }}</tr>
{% else %}
    {% if not task.shared_task_id %}
        <tr>{{ task }}</tr>
    {% endif %}
{% endifchanged %}

并不是真的坚持DRY原则,而是对你现在使用的东西不那么苛刻。 Django的模板语言并不适用于高级逻辑,因此我认为没有更好的解决方案。

如果您需要打印大量内容而不仅仅是{{ task }},我认为不重复自己并减轻更新代码的痛苦的最佳方法是使用单独的模板并使用{{1 }}。