我目前正在研究可很好地呈现表单的模板标签。

@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 }}在include中不起作用(请参见https://stackoverflow.com/a/6566463/2014080)。

最佳答案

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

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

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


关键是它们是Django收集的,您可以在视图或templatetag中或任何有权访问所有表单的地方对其进行操作。假设您有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/

10-12 22:37