Вы определенно можете сделать это, если хотите написать еще несколько строк кода на Python, чтобы улучшить читаемость шаблона!:)
Вам необходимо самостоятельно проанализировать содержимое тега, даже параметры, которые он принимает, и затем разрешить их, если вы хотите использовать переменные для них.
Тег, реализованный ниже, можно использовать какэто:
{% load mytag %}
{% mytag True %}Hi{% else %}Hey{% endmytag %} Bro
Или с переменной:
{% mytag myobject.myflag %}Hi{% else %}Hey{% endmytag %} Bro
Итак, вот как я это сделал:
from django.template import Library, Node, TemplateSyntaxError
register = Library()
@register.tag
def mytag(parser, token):
# Separating the tag name from the "test" parameter.
try:
tag, test = token.contents.split()
except (ValueError, TypeError):
raise TemplateSyntaxError(
"'%s' tag takes two parameters" % tag)
default_states = ['mytag', 'else']
end_tag = 'endmytag'
# Place to store the states and their values
states = {}
# Let's iterate over our context and find our tokens
while token.contents != end_tag:
current = token.contents
states[current.split()[0]] = parser.parse(default_states + [end_tag])
token = parser.next_token()
test_var = parser.compile_filter(test)
return MyNode(states, test_var)
class MyNode(Node):
def __init__(self, states, test_var):
self.states = states
self.test_var = test_var
def render(self, context):
# Resolving variables passed by the user
test_var = self.test_name.resolve(context, True)
# Rendering the right state. You can add a function call, use a
# library or whatever here to decide if the value is true or false.
is_true = bool(test_var)
return self.states[is_true and 'myvar' or 'else'].render(context)
И это все.НТН.