模板标签模板中的 Django 模板块

Posted

技术标签:

【中文标题】模板标签模板中的 Django 模板块【英文标题】:Django template block from within template tag template 【发布时间】:2018-10-21 23:13:24 【问题描述】:

我有一个名为 base.html 的模板。这个模板在 jQuery 加载后在底部包含一个名为 pagescripts 的块,如下所示:

<div class="container-fluid">  
% block content %
% endblock %
</div>
<script src="https://code.jquery.com/jquery-3.3.1.min.js" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
<script defer src="https://use.fontawesome.com/releases/v5.0.10/js/all.js" integrity="sha384-slN8GvtUJGnv6ca26v8EzVaR9DC58QEwsIk9q1QXdCU8Yu8ck/tL/5szYlBbqmS+" crossorigin="anonymous"></script>
% block pagescripts %
% endblock %

接下来,我有一个模板标签,它是一个包含标签,用于显示特定新闻文章的精美 boostrap 4 卡片,如下所示:

@register.inclusion_tag('long_article_card.html', takes_context=True)
def show_long_card(context, article):
try:
    contextForm = context['form']
except KeyError:
    contextForm = None

return 'article':article, 'form': contextForm

现在,在 long_article_card.html 中,我想从 base.html 向 pagescripts 块添加一个脚本。所以,在 long_article_card.html 中,我有这个:

<div class="target">TARGET HERE</div>
<a class="dropdown-item" id="lean-vote-xl" href="#">Extreme Left</a>
% block pagescripts %
<script>
$(document).ready(function()
$("#lean-vote-xl").on('click', function()
    $.ajax(
        url:'/webproxy/v/?i=a&pk=article.id&t=1&v=3',
        type:'get',
        dataType:'html',
        crossDomain:true,
        success:function(data)
       
       var outputCard = "<div class=\"target\"><br><h2>That worked</h2></div>";
        $(".target").html(outputCard);
       ,
        error: function(data) 
            var outputCard = "<div class=\"target\"><br><h2>Load Error</h2></div>";
            $(".target").html(outputCard);
        
    );
); // end id_url_text    
);
</script>
% endblock %

然后从名为 article/detail.html 的文章详细信息模板调用该模板标记,该模板扩展了 base.html。

% extends 'base/base.html' %
<div class="row">
% show_long_card article %
</div>

但这会导致 long_article_card.html 中的 javascript 在 long_article_card.html 的末尾呈现,这意味着它是在页面底部加载 jQuery 之前呈现的,因此脚本不起作用,因为 $ 不是尚未定义。我需要做的是让 long_article_card.html 中的块页面脚本呈现在页面的最底部,基本上是在 base.html 的底部。我需要 django 从 long_article_card.html 中获取块 pagescripts,将其传递给 article/detail.html,然后 article/detail.html 将其传递给 base.html,然后 base.html 将它包含在它的 pagescripts 块中在加载 jQuery 后位于 base.html 的最底部。

我不能让 long_article_card.html 扩展 article/detail.html,因为它会导致递归错误。 long_article_card.html 有没有办法向 base.html 的 pagescripts 块添加内容?

谢谢。

【问题讨论】:

为什么不在 base.html 中使用% include % 好吧,我不希望网站上到处都是用于文章详细信息的 javascript,并且在网站上到处都在使用 base.html。所以我不明白我会在那里包含什么? 实际上你的 js 文件将只用于这个文件,在块页面脚本中。让我举一个例子。坚持 【参考方案1】:

django-sekizai 是为此用例构建的。可能对你有用

【讨论】:

这是个好主意,但不幸的是,Sekizai 库似乎只支持 Django 1.10,而我使用的是 Django 2.0。 Sekizai 要求上下文是 RequestContext 对象或 SekizaiContext 对象。 Django 2 的模板库似乎要求上下文是一个字典。具体来说,以下会产生错误: tmpl = get_template('article/detail.html') ctxt = RequestContext(request, 'form': form, 'article': art) return HttpResponse(tmpl.render(ctxt))

以上是关于模板标签模板中的 Django 模板块的主要内容,如果未能解决你的问题,请参考以下文章

Django 模板的 Vim 内部标签块

是否可以使用 django 的自定义模板标签在模板的其他块中插入代码?

Django模板:在同一基础中使用多个块标签

在 django 模板 URL 标签中传递参数

django-模板文件继承

django-7.django模板继承(block和extends)