不要从 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 文件