2015-01-23 3 views
0

Скажем, у меня есть этот метод:Можно ли использовать собственный тег внутри блока Django if?

def is_root_task(self, root=None): 
    '''Returns true if the task is the root of a series of other tasks''' 
    super_tasks = self.dependency_sub_task.all() 
    if not root: 
     return not super_tasks.exists() 
    else: 
     return not super_tasks.exclude(task_id__exact=root.id).exists() 

И я зарегистрировать его так:

from django import template 
from gantt_charts.models import Task 

register = template.Library() 

register.tag('is_root_task', Task.is_root_task) 

Как я называю это внутри, если блок (или аналогичный)? Например, я хочу, чтобы это было в моей странице:

<ul> 
{% for sub_task in task.sub_tasks %} 
{% if is_root_task "sub_task" "task" %} 
    <li > 
     <p>{{sub_task.title}}</p> 
     <p>{{sub_task.description}}</p> 
    </li> 
{% endif %} 
{% empty %} 
    <li> No Sub-tasks</li> 
{% endfor %} 
</ul> 

Я хочу передать переменные задачи (корень) и переменную sub_task (самообеспечение) к is_root_task и Eval его внутри, если блок. Это возможно?

+1

Вам нужно сделать этот фильтр, а не тегом, тогда вы можете сделать '{% if sub_task | is_root_task: task%}'. –

+1

'with' шаблон тегов mays help https://docs.djangoproject.com/en/dev/ref/templates/builtins/#with – Vinta

+0

Я дам им идти, когда вернулся с – Pureferret

ответ

0

Я решил эту проблему с помощью Daniel Roseman

Все же, за исключением я выгружена tag для filter. Я не уверен, почему работают фильтры и теги, но не так.

register.tag('is_root_task', Task.is_root_task) 

И в HTML я использую:

{% if sub_task|is_root_task:task %} 
1

На Django 1.9 вы можете также сделать это в 2 этапа, установив переменную с выхода тега, а затем, используя переменную внутри if.

Это описано в нижней части документации Simple Tag по адресу: https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/#simple-tags

В вашем случае это будет выглядеть следующим образом:

{% is_root_task "sub_task" "task" as myflag %} 
{% if myflag %} 
    Do some stuff 
{% endif %} 

Этот способ делать вещи хорошо, если вы повторно использовать myflag, чтобы избежать накладных расходов на повторное вызов тега.

Смежные вопросы