2013-07-26 31 views
0

我有我的模板以下逻辑:Ifchanged如果不为null

{% 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 %} 

有没有办法做到这一点?

+0

我对你的问题有些困惑。在你的问题中,如果它的id是'None',你似乎不想打印任务,但是在你自己的回答中,如果它的id是'None',即使没有改变,你总是希望打印一个任务? – knbk

+0

@knbk谢谢,我更新了我的问题中的代码来澄清。 – David542

回答

0

试一下这个(与总管Hieu的修复编辑):

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

不是真的坚持DRY的原则,但方式不那么hackish,你现在使用什么。 Django的模板语言并不适用于高级逻辑,所以我不认为有更好的解决方案。

如果您需要打印大量的东西,而不是仅仅{{ task }},我想不重复自己丰富和易于更新代码的疼痛最好的方法是使用一个单独的模板,并使用{%include <other_template> %}

+0

@ David542 @knbk我认为这不会奏效。 2串行if语句将允许通过。例如列表[1,无],在第二次迭代中,“任务”将被打印两次。 –

+0

@Hieu你是对的,更新了我的答案。 – knbk

0

我经过某种hackish的方式在模型现在这样做:

{% 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()) 

关于如何解决此问题的任何更好的想法?

0

既然你不能在{% ifchange %}andor逻辑,你总是可以使用2如果块来实现你想要的:

{% 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 %}