使用JavaScript扩展Django表单集
项目描述
JavaScript表单集辅助工具的包装器。
安装
通过pip安装
pip install django-formset-js
然后将其及其依赖项 django-jquery-js 添加到您的 INSTALLED_APPS
INSTALLED_APPS += (
'django.contrib.staticfiles',
'jquery',
'djangoformsetjs',
)
使用
包含JavaScript库
jQuery和此库都必须包含在您的页面上。最简单的方法是将脚本作为表单的媒体依赖项添加。
from djangoformsetjs.utils import formset_media_js
class MyForm(forms.Form):
class Media(object):
js = formset_media_js + (
# Other form media here
)
MyFormSet = formset_factory(MyForm)
然后在您的模板中包含表单的媒体
{{ formset.media }}
或者,只需添加脚本标签
<script src="{{ STATIC_URL }}js/jquery.js"></script>
<script src="{{ STATIC_URL }}js/jquery.formset.js"></script>
渲染表单集
为了使库能与您的表单集一起工作,您的表单集中的某些部分需要使用 data-formset-... 属性进行标记
{% load formset_tags %}
<div id="formset" data-formset-prefix="{{ formset.prefix }}">
{{ formset.management_form }}
<div data-formset-body>
<!-- New forms will be inserted in here -->
{% for form in formset %}
<div data-formset-form>
{{ form }}
<button type="button" data-formset-delete-button>Delete form</button>
</div>
{% endfor %}
</div>
<!-- The empty form template. By wrapping this in a <script> tag, the
__prefix__ placeholder can easily be replaced in both attributes and
any scripts -->
<script type="form-template" data-formset-empty-form>
{% escapescript %}
<div data-formset-form>
{{ formset.empty_form }}
<button type="button" data-formset-delete-button>Delete form</button>
</div>
{% endescapescript %}
</script>
<!-- This button will add a new form when clicked -->
<input type="button" value="Add another" data-formset-add>
<script>jQuery(function($) {
$("#formset").formset({
animateForms: true
});
});</script>
</div>
data-formset- 数据属性是
- data-formset-prefix
{{ formset.prefix }} 的值。这用于找到管理表单。
- data-formset-body
这表示所有子表单的位置。新表单将插入到这里。
- data-formset-form
每个表单(包括空表单)都应该有此属性。
- data-formset-empty-form
包含空表单模板的元素。为了获得最佳效果,请使用 <script> 标签。
- data-formset-add
添加新表单的按钮。
- data-formset-delete-button
删除表单的按钮。
空表单模板被包裹在一个 <script> 标签中作为纯文本。这阻止了在页面加载时任何附加到小部件上的 JavaScript 运行,并使得查找和替换 __prefix__ 占位符变得更容易。应在 <script> 内容周围使用 {% escapescript %} 块来防止内部的脚本标签过早地关闭包装脚本标签。
当点击 data-formset-add 按钮时,会在所添加的表单上触发 formAdded 事件。该事件会向上传播,因此可以从表单容器处处理。例如,为了从上面的示例中选择新添加的表单,可以绑定如下:
$('#formset').on('formAdded', function(event) {
newForm = event.target;
//Do Stuff
});
如果可以删除表单,并且包含删除复选框,以下操作会发生:
当复选框被勾选,标记表单为删除时,会在 data-formset-form 容器上触发 formDeleted 事件,并添加 data-formset-form-deleted 属性。
当复选框被取消勾选,将表单标记为再次激活时,会在 data-formset-form 容器上触发 formAdded 事件,并移除 data-formset-form-deleted 属性。
如果可以删除表单,并且包含删除按钮,按下删除按钮将切换该表单的删除复选框。如果使用删除按钮,应隐藏 DELETE 字段。删除按钮通过 data-formset-delete-button 属性进行识别。
{% for form in formset %}
<div data-formset-form>
{{ form.name }}
{{ form.age }}
<div class="hidden">{{ form.DELETE }}</div>
<button type="button" data-formset-delete-button>Delete form</button>
</div>
{% endfor %}
如果创建表单集时设置了 animateForms 选项,添加和删除表单将通过滑动表单进入和退出进行动画处理。
选项
jQuery 插件接受以下选项
- 表单:
用于查找表单的选择器。默认为 [data-formset-form]。
- 空表单:
用于查找空表单模板的选择器。默认为 script[type=form-template][data-formset-empty-form]。
- 主体:
用于查找表单集主体的选择器。新表单将插入此元素的底部。默认为 [data-formset-body]。
- 添加:
用于查找添加按钮的选择器。默认为 [data-formset-add]。
- 删除按钮:
用于在表单内查找删除按钮的选择器。默认为 [data-formset-delete-button]。
- hasMaxFormsClass:
当达到表单的最大数量时添加到表单集的类。最大表单数量从管理表单中提取。默认为 has-max-forms。
- animateForms:
是否对表单的添加/删除进行动画处理。默认为 false。
JavaScript API
如果捆绑的功能不适合您,可以使用 JavaScript API 与表单集交互。所有行为都由一个 Formset 类驱动。要获取元素的 Formset,调用
var formset = $('#my-form').formset('getOrCreate');
这可以在单个元素上多次调用,并且总是返回相同的 Formset 实例。下面列出的所有方法和属性都在 Formset 实例上操作。
- Formset.opts
创建此 Formset 所使用的选项。
- Formset.$formset
为Formset创建的元素。
- Formset.$emptyForm
用于创建新表单的空表单模板。
- Formset.$body
创建新表单的元素。
- Formset.$add
用于添加新表单的按钮。
- Formset.addForm()
将表单添加到Formset中。如果添加另一个表单将超过最大数量,将抛出错误。
- Formset.$forms()
获取Formset中所有表单的jQuery对象。
- Formset.$managementForm(field)
获取管理表单字段field的jQuery对象
// Update the TOTAL_FORMS management form field this.$managementForm('TOTAL_FORMS').val(10);
- Formset.totalFormCount()
计算Formset中表单的总数,包括已删除的表单。
- Formset.activeFormCount()
计算Formset中活动(未删除)表单的总数。
- Formset.deletedFormCount()
计算Formset中已删除表单的数量。
- Formset.hasMaxForms()
如果Formset已达到其最大表单数,则返回true。
- Formset.checkMaxForms()
检查Formset中的表单数量,并在Formset达到限制时在Formset元素上设置相关类。
示例
在example/目录中提供了一个最小示例项目。阅读example/README以获取更多信息
开发
当运行./setup.py sdist时,如果已安装,将使用UglifyJS对JavaScript资源进行压缩。要安装UglifyJS,请安装node.js和npm,并运行
npm install uglifyjs
您可以使用以下方式手动压缩脚本
./setup.py minify
项目详情
django-formset-js-0.5.0.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 7cf24616b4d28422a8c17a279c6903150185d798930b050ab30b8011592caa48 |
|
MD5 | 3d0dd84b970cb5516b5061bb7621e79d |
|
BLAKE2b-256 | 9952b261dbf5b739fcf08c37b80eeab4b6b84fc92338da478e430914ad748d64 |