统一 Django 表单媒体

Posted

技术标签:

【中文标题】统一 Django 表单媒体【英文标题】:Uniting Django Form media 【发布时间】:2013-04-15 22:06:43 【问题描述】:

我有几个 Django 模板,其中一些具有不同的形式。一些表单使用需要自己的 JS 和 CSS 资源的自定义小部件。这些资源在每个form.media中正确指定

我发现放置所有媒体引用的正确位置是在我的<head> 标记中,就在我自己的css 文件上方。如果我愿意,这将允许我覆盖自定义小部件的外观。所以在我的模板中我有类似的东西:

% block form_media %
 form1.media 
 form2.media 
% endblock %

(有些模板不止一种形式)

现在,如果两个表单都使用相同的小部件,那么相同的 JS 和 CSS 文件将被引用两次。这不可能很好。有没有合理的方法来统一所有的媒体参考?

这只是请求自定义% context_form_media %标签,它将呈现请求上下文中所有表单的媒体。

【问题讨论】:

【参考方案1】:

您可以通过块和继承来做到这一点。

base.html:

<head>
    % block form_css %
        # base css #
    % endblock form_css %
    # rest of head #
</head>
# rest of html #

任何form.html:

% extends "base.html" %
% block form_css %
    # your form css #
% endblock form_css %
# your form #

这样您就可以只注入适用于该页面的 css/js。如果您还想包含该块的所有上游内容,您可以使用 block.super 开始它。

【讨论】:

为此获得反对票我有点惊讶。有人可以解释为什么吗?这只是继承块的标准技术。

以上是关于统一 Django 表单媒体的主要内容,如果未能解决你的问题,请参考以下文章

不要从 django 表单打印媒体

模板中 Django 表单的媒体类对象的 JS 和 CSS 列表输出分离

Django:在基于类的视图中包含媒体(css/js)

Django中使用表单

表单对象没有属性“save_m2m”django

Django之form表单操作