gpt4 book ai didi

django-templates - 将 wagtail streamfield block 依赖项插入模板的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-05 06:36:25 31 4
gpt4 key购买 nike

我依靠模板继承系统将 extra_css 和/或 extra_js 插入我的页面:

base.html:

<!DOCTYPE html>
<html lang="en">
<head>
<!-- Core CSS -->

{% block extra_css %}
{# Override this in templates to add extra stylesheets #}
{% endblock %}

</head>
<body>

{% block content %}{% endblock content %}

<!-- Core JS -->

{% block extra_js %}
{# Override this in templates to add extra javascript #}
{% endblock extra_js %}

</body>
</html>

page.html:

{% extends "base.html" %}

{% block extra_css %}
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
{% endblock %}

{% load wagtailcore_tags wagtailimages_tags %}

{% block content %}
<div class="blog-post">

<!-- Custom HTML -->

{% block content %}
{% include_block page.body %}
{% endblock %}

</div><!-- /.blog-post -->
{% endblock %}

{% block extra_js %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
<script type="text/javascript">

// Custom JavaScript

</script>
{% endblock extra_js %}

这很好用,因此额外的 css/js 确实插入了它所属的位置。

如果我需要使用 streamfield,其中一个 block 模板需要自定义 css/js,就会出现问题。在这种情况下,自定义资源随 block 一起插入,但不在 base.html 中的指定位置。

例如,如果将上例中 page.html 中的 extra_js 添加到 block 模板中,则 select2 会报错关于 jquery 不存在,这是完全正确的,因为它是与 block 一起插入的,但不是按预期在 Core JS 库之后。

加载 jquery 两次会导致其他问题:https://stackoverflow.com/a/25782679/2146346

其他选项是将所有 block 依赖项加载到页面中,但它会用冗余资源填充页面,因为并非 streamfield 中的每个 block 都可能在页面上使用。

还有其他选择吗?

最佳答案

更新:这里有一个更好的方法,它使用 JavaScript 只加载一次库:https://github.com/FlipperPA/wagtailcodeblock/blob/main/wagtailcodeblock/templates/wagtailcodeblock/code_block.html#L6

我还没有想出我喜欢的方式来做这件事。在 Wagtail 编辑器端执行此操作的工具非常好。但是,这是我为 WagtailCodeBlock 所做的:

{% load static wagtailcodeblock_tags %}
{% spaceless %}
{# This is ugly, as it'll inject this code for each block, but browsers are smart enough to not load each time. #}
<script src="{% static 'wagtailcodeblock/js/prism.min.js' %}" type='text/javascript'></script>
<link href="{% static 'wagtailcodeblock/css/prism.min.css' %}" rel="stylesheet">
{% load_prism_theme %}
{% for key, val in self.items %}
{% if key == "language" %}
<script>
language_class_name = 'language-{{ val }}';
</script>
{% endif %}
{% if key == "code" %}
<pre class="line-numbers">
<code id="target-element-current">{{ val }}</code>
</pre>
<script>
var block_num = (typeof block_num === 'undefined') ? 0 : block_num;
block_num++;
document.getElementById('target-element-current').className = language_class_name;
document.getElementById('target-element-current').id = 'target-element-' + block_num;
</script>
{% endif %}
{% endfor %}
{% endspaceless %}

在这个例子中,我分别加载了 JS/CSS 资源,然后让浏览器解决它。它还假定 jQuery 是在父级加载的。但是,也可以使用 JavaScript 上下文来确保只加载一次,这是我的下一步。现在,它不是很漂亮,但它可以工作。

在 Wagtail 编辑器方面,有 @property media。我希望渲染端有类似的东西:

class CodeBlock(StructBlock):
"""
Code Highlighting Block
"""

WCB_LANGUAGES = get_language_choices()
off_languages = ['html', 'mathml', 'svg', 'xml']


language = ChoiceBlock(choices=WCB_LANGUAGES, help_text=_('Coding language'), label=_('Language'))
code = TextBlock(label=_('Code'))

@property
def media(self):

theme = get_theme()

prism_version = get_prism_version()
if theme:
prism_theme = '-{}'.format(theme)
else:
prism_theme = ""

js_list = [
"https://cdnjs.cloudflare.com/ajax/libs/prism/{}/prism.min.js".format(
prism_version,
),
]

for lang_code, lang_name in self.WCB_LANGUAGES:
# Review: https://github.com/PrismJS/prism/blob/gh-pages/prism.js#L602
if lang_code not in self.off_languages:
js_list.append(
"https://cdnjs.cloudflare.com/ajax/libs/prism/{}/components/prism-{}.min.js".format(
prism_version,
lang_code,
)
)
return Media(
js=js_list,
css={
'all': [
"https://cdnjs.cloudflare.com/ajax/libs/prism/{}/themes/prism{}.min.css".format(
prism_version, prism_theme
),
]
}
)

class Meta:
icon = 'code'
template = 'wagtailcodeblock/code_block.html'
form_classname = 'code-block struct-block'
form_template = 'wagtailcodeblock/code_block_form.html'

我希望这能给你一些想法,如果你想出更好的方法,我会洗耳恭听。祝你好运。

关于django-templates - 将 wagtail streamfield block 依赖项插入模板的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49110833/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com