Я не уверен, что сделает ваша логика шаблона остановки обработки;но более чистый способ сделать вашу логику - написать собственный тег, который принимает ваши аргументы, а затем возвращает только HTML-код, относящийся к вашим переменным.Таким образом вы удаляете петли if/else
и заменяете все это простым тегом {% do_stuff %}
.
Редактировать
Это очень простая реализация, чтобы дать вамнекоторая идея о том, как будет действовать логика.
Сначала вы создаете шаблоны для каждого варианта и сохраняете их где-то, где django может их найти.
Затем простой тег, который отображает нужный шаблон.(это не проверено, псевдо):
from django import template
from django.db.models import get_model
register = template.Library()
class ProcessData(template.Node):
def __init__(self, var_name):
self.obj = get_model(*var_name.split('.'))
def render(self, context):
if self.obj.some_state:
t = template.loader.get_template('some_markup_template.html')
result = 'something'
else:
if self.obj.some_state_2:
t = template.loader.get_template('some_different_html_view.html')
result = 'something'
else:
if self.obj.process_data:
t = template.loader.get_template('some_list_data.html')
result = 'something'
else:
t = template.loader.get_template('no_data.html')
result = 'something'
return t.render(Context({'result': result}, autoescape=context.autoescape))
@register.tag
def process_data(parser, token):
try:
tag_name, arg = token.contents.split(None, 1)
except ValueError:
raise template.TemplateSyntaxError("%r tag requires arguments" % token.contents.split()[0])
return ProcessData(arg)
Наконец, в вашем шаблоне:
{% load my_tags %}
{% process_data data.mymodel %}