2014-02-16 27 views
3

我想要与我的Django模板一起干,并且有一些代码可以与CSS混合以实现简单的悬停弹出窗口。我想重复使用代码,但弹出窗口的内容将是HTML,可能跨越多行。是否可以将多行字符串填充到模板变量中?在Django'包含'语句中的多行字符串

我试着做一些时髦的积木和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多行模板标签,但没有任何办法解决这,不是挤压我所有的div的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”变量%}和模板{%变量%中的项%}

  • {%endfor%} – pepourquier

    相关问题