不要从 django 表单打印媒体

Posted

技术标签:

【中文标题】不要从 django 表单打印媒体【英文标题】:Do not print media from django form 【发布时间】:2017-12-14 20:08:15 【问题描述】:

我创建了一个自定义小部件并包含一个 Media 类。

class MyWidget(forms.MultiWidget):

    class Media:
        css = 
            'all': ('path-to-css.css',),
        
        js = (
            'path-to-js.js',
        )

    def __init__(self, visible_input_attrs=None, hidden_input_attrs=None):
        widgets = (
            TextInput(attrs=visible_input_attrs),
            HiddenInput(attrs=hidden_input_attrs),
        )
        super(MyWidget, self).__init__(widgets)

    def decompress(self, value):
        if value:
            return ['', value]
        return [None, None]

在我的表单中,我使用这个小部件如下

class UserForm(forms.ModelForm):

    class Meta:
            model = User
            fields = [
                'first_name',
                'last_name',
                'email',
                'phone_number',

            ]
            widgets = 
                'phone_number': MyWidget(),
            

我的模板文件

% extends "base.html" %
% load static i18n crispy_forms_tags %

% block content %

  <div class="row">
    <div class="col-sm-12">

      <form id="my-form" action="" method="post" enctype="multipart/form-data">
        <h2>Contact details</h2>
        % crispy user_form %
      </form>

    </div>
  </div>

% endblock content %

% block javascript %
   block.super 
   user_form.media.js 
% endblock %

在我的模板文件中,我包含带有% crispy user_form % 的表单(使用清晰的表单)。 Django 特此自动在表单开头添加 CSS 和 JS 文件。由于我在每个 HTML 页面的最后加载 JS 文件,并且由于包含的 path-to-js.js 文件需要 jQuery,因此我将 user_form.media.js 附加到模板中的 javascript 块中。结果,path-to-js.js 在我的页面上出现了不止一次,并导致错误消息,因为第一次加载 path-to-js.js 时,还没有加载 jQuery。

使用时如何避免加载JS文件% crispy user_form %

【问题讨论】:

【参考方案1】:

在helper 类中设置include_media = False

class UserForm(forms.ModelForm):
    ...

    def __init__(self, *args, **kwargs):
        super(UserForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.include_media = False

【讨论】:

以上是关于不要从 django 表单打印媒体的主要内容,如果未能解决你的问题,请参考以下文章

将 Django 表单资产(媒体类)与清晰表单一起使用时,页面中不包含 .js 文件

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

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

django:打印表单错误时如何删除项目符号

从 Django 表单中写入输入类型的值

带有 ReactJS 的 Django 表单