2014-02-16 4 views
3

Я пытаюсь быть сухим с моими шаблонами Django и имею код, который я смешиваю с CSS для простого всплывающего всплывающего окна. Я хотел бы повторно использовать код, но содержимое моего всплывающего окна будет HTML, которое может охватывать несколько строк. Можно ли вставлять многострочные строки в переменную шаблона?Многострочная строка в заявлении Django 'include'

Я пытался сделать что-то в стиле фанк с блоками и block.super но кажется, что работать только при расширении (не include)

Вот пример того, что я хотел бы сделать. Является ли это возможным?

index.html

<body> 
<h2>My Popup</h2> 
{% include "snippets/popup.html" with class="p" spantext="Hover me" popupdiv=""" 
    <h2>This is a popup!</h2> 
    <ul> 
      <li>Something</li> 
      <li>Something else</li> 
    </ul> 
""" 
%} 
</body> 

snippets/popup.html

<div class="{{ class }}"> 
    <span class='pointer'>{{ spantext }}</span> 
    <div class="popup"> 
     {{ popupdiv }} 
    </div> 
</div> 

Я знаю, что это не возможно, чтобы иметь теги шаблона многострочные в Django, но есть ли способ обойти это, кроме давя все мои Див HTML на одну строку и избежать кавычек?

Приветствия

ответ

2

Получается, что «Анализ до тех пор, пока другой тег для шаблона» не будет тем, чем я был после. http://www.djangobook.com/en/2.0/chapter09.html

Вот мой код:

tags.py (в папке templatetags)

from django import template 
from django.template.loader import get_template 
from django.template.base import Node, TemplateSyntaxError 

register = template.Library() 

class PopupNode(Node): 
    def __init__(self, nodelist, class_name, spantext): 
     self.nodelist = nodelist 
     self.class_name = class_name 
     self.spantext = spantext 

    def render(self, context): 
     popup_html = get_template("ordersystem/snippets/popup.html") 
     context.update({ 
      'class' : self.class_name, 
      'spantext' : self.spantext, 
      'popupdiv' : self.nodelist.render(context) 
     }) 
     return popup_html.render(context) 

@register.tag('popup') 
def show_popup(parser, token): 
    nodelist = parser.parse(('endpopup',)) 
    tokens = token.split_contents() 
    if len(tokens) != 4: 
     raise TemplateSyntaxError("show_popup is in the format 'popup with class=X spantext=Y") 
    try: 
     context_extras = [t.split("=")[1].strip('"') for t in tokens[2:]] 
    except IndexError: 
     raise TemplateSyntaxError("show_popup is in the format 'popup with class=X spantext=Y") 
    parser.delete_first_token() 
    return PopupNode(nodelist, *context_extras) 

Тогда в моем HTML файл я просто не могу сделать:

{% popup with class_name=management spantext=Manage %} 
<h2>This is a popup!</h2> 
    <ul> 
      <li>Something</li> 
      <li>Something else</li> 
    </ul> 
{% endpoup %} 
-1

Лучший способ должен быть создать templatetags в вашем модуле с включения тега.

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

Итак, представьте, ваш являются YourModule yourModule с папкой templatetags и файл popup_tag.py

yourModule/ 
---- views.py 
---- models.py 
---- templates/ 
    ---- snippet/ 
      ---- popup.html 
---- templatetags/ 
    ---- __init__.py 
    ---- popup_tag.py 

Ваш popup_tag.py может выглядеть следующим направлениям:

from django import template 

register = template.Library() 

def show_pop_up(class, span_text, popupdiv): 
    return {'class': class, 
      'span_text': span_text, 
      'pop_up_div': pop_up_div} 

register.inclusion_tag('snippet/popup.html')(show_popup) 

Затем вам просто нужно позвоните своему тегу в свой шаблон index.html.

{% load popup_tag %} 

{% show_popup "class" "span_text" "popupdiv" %} 
+0

Я не проверял это, но я предполагаю, что, поскольку вы все еще используете тег шаблона ('show_popup'), вы по-прежнему не можете добавить текст, который охватывает несколько строк? Я пересмотрел свой вопрос, чтобы быть более явным о том, что я хочу – Patrick

+0

Это не работает. Он по-прежнему отстает от нескольких строк. – Patrick

+0

Вы хотите, чтобы абсолютное использование списка html? Можете ли вы использовать переменную цикла при вызове тега шаблона. Например, {% show_popup "class", "span_text" variable%} и в вашем шаблоне {% for item in variable%}

  • item
  • {% endfor%} – pepourquier

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