python - 如何只包含一次js和css

标签 python django templates

我目前正在开发一个可以很好地呈现表单的模板标记。

@register.inclusion_tag('myforms.html', takes_context=True)
def myform(context, form)
    context['form'] = form
    context['error_classes'] = 'has-error has-feedback'

    return context

myforms.html ,我使用了一些 JavaScript 库和 css 文件。在模板中我添加了脚本:

<link rel="stylesheet" href="{% static 'xyz.css' %}"/>
<script lang="javascript" src="{% static 'xyz.js' %}"></script>
<div>
   ...
</div>

在单个站点上呈现多个表单时,这些 <links><script>在 html 文档中多次出现。

一种可能性是将它们包含在 <head> 内的基本模板中标签。但即使不需要它们,它们也会出现在 html 文件中。

添加 {{ block head }}<head> 内的基本模板也不行。为此{{ block.super }}需要附加新的 js 和 css 文件,但是 {{ block.super }}不适用于包含(请参阅 https://stackoverflow.com/a/6566463/2014080 )。

最佳答案

我有点好奇你为什么使用include。尽管它们确实有一些用例,但您不应该经常使用它们。无论如何。

Django 表单恰好有一个功能,可以收集 assets 基本上,您应该直接在表单上定义特定于表单的媒体,如下所示:

class MyForm(ModelForm):
    # whatever you have there, then
    class Media:
        css = {
            'screen': ('foo.css', 'bar.css'),
        }
        js = ('jquery.js', 'myform.js')

重点是它们是由 Django 收集的,您可以在您的 View 或模板标记中或者您可以访问所有表单的任何地方操作它们。假设您有 MyFormMyOtherForm,您可以执行以下操作:

context['form_media'] = my_form.media + my_other_form.media

并且,在您的根模板中,您可以执行以下操作:

<head>
    {{ form_media }}
</head>

只要你所有的观点都遵守这个约定。

关于python - 如何只包含一次js和css,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31102857/

相关文章:

python - Pyspark 管道中用户定义的变压器

python - 如何在 Eclipse 中的 Django 项目中使用生菜?

asp.net - 推荐 ASP.NET 模板的源吗?

python - apt-get 的需求文件,类似于 pip

python - 按天过滤 django 查询

python - Django runserver错误: _frozen_importlib. _DeadlockError:由_ModuleLock ('django.test.signals'检测到死锁)在139824587568800

python - Django:如何将 QuerySet 转换为字符串

python - 类型错误 : argument of type 'WindowsPath' is not iterable - in django python

c++ - 模板双重编译?

c++ - C++ 中的非类型模板参数可以使用大括号初始值设定项吗?