Django Template - прекратить обработку шаблона - PullRequest
4 голосов
/ 09 декабря 2011

Я ищу способ очистить шаблон в Django. Простым решением было бы разбить это на несколько шаблонов, но мы не хотим этого делать.

У нас в основном есть следующее

{%if data.some_state %}
    Display some markup
{% else %}
   {%if data.some_state_2 %}
       State 2 different html view 
   {% else %}
        {%if data.process_data %}
           Display some list of data
        {% else %}
           No Data to display!
       {% endif %} <!-- if data.process_data-->
   {% endif %} <!-- if data.some_state_2 -->
{% endif %} <!-- if data.some_state -->

Так что это очень запутанно и трудно читать. Если бы я мог сделать это в «функции», я бы использовал if / else if или return.

Есть ли способ на языке шаблонов сделать что-то вроде (stop_processing_template сообщит шаблону, что мы закончили ...):

{%if data.some_state %}
    Display some markup
{% endif %}
{% django_stop_processing_template %}


{%if data.some_state_2 %}
       State 2 different view
{% endif %}
{% django_stop_processing_template %}

{%if data.process_data %}
           Display some list of data
{% endif %}
{% django_stop_processing_template %}

 No data provided !

Ответы [ 4 ]

4 голосов
/ 09 декабря 2011

Я не уверен, что сделает ваша логика шаблона остановки обработки;но более чистый способ сделать вашу логику - написать собственный тег, который принимает ваши аргументы, а затем возвращает только 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 %}
3 голосов
/ 09 декабря 2011

Вы можете использовать jinaj2 для шаблонизации этого представления (или всего проекта), он поддерживает if / elif / else ветвления:

{% if data.some_state %}
    Display some markup
{% elif data.some_state_2 %}
    State 2 different view
{% elif data.process_data %}
    Display some list of data
{% endif %}

Естьпара разных пакетов, которые легко использовать jinja2 в проекте django, для этого я использовал coffin и djinja .

2 голосов
/ 10 декабря 2011

Хотя я думаю, что подход @ burhan лучше, вы также можете сделать то, что вы хотите сделать, используя пользовательский тег, который устанавливает переменную контекста в логическую переменную, а внешнюю часть можно также преобразовать вa if tag

#Set a context variable nodata to True 
{% setnodata True %}  
{%if data.some_state %}
    Display some markup
    #Set context variable nodata to False  
    {% setnodata False %}
{% endif %}

{%if data.some_state_2 %}
    State 2 different view
    #Set context variable nodata to False  
    {% setnodata False %} 
{% endif %}

{%if data.process_data %}
    Display some list of data
    #Set context variable nodata to False  
    {% setnodata False %}
{% endif %}

{% if nodata %}
    No data provided !
{ % endif %}

Пользовательский тег setnodata просто устанавливает переменную контекста nodata в True или False в зависимости от аргумента.

1 голос
/ 23 декабря 2013

сегодня я встречаю тот же вопрос.И я нахожу этот тег {% verbatim%} {% endverbatim%} . Это работает в Django1.5 + Пример:

  {% verbatim %} 
  <div class="entry">
    <h1>{{ title }}</h1>
    <div class="body">
      {{ body }}
    </div>
  </div>
  {% endverbatim %}

Вы также можете посмотреть ниже более подробную информацию:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...