我有一些与标准 django 表单输入字段一起出现的复杂 GUI 元素(例如可以突出显示多天的自定义日历)。我想处理来自这些复杂表单的数据 I/O 以及 Django 表单。
以前,在保存或呈现 Django 表单后,我会使用 AJAX 请求来处理我的 HTML 表单上的这些自定义 GUI 元素,但这会导致大量问题和自定义 AJAX 编码。在 Django 表单中处理复杂交互小部件的好方法是什么?
我有一些与标准 django 表单输入字段一起出现的复杂 GUI 元素(例如可以突出显示多天的自定义日历)。我想处理来自这些复杂表单的数据 I/O 以及 Django 表单。
以前,在保存或呈现 Django 表单后,我会使用 AJAX 请求来处理我的 HTML 表单上的这些自定义 GUI 元素,但这会导致大量问题和自定义 AJAX 编码。在 Django 表单中处理复杂交互小部件的好方法是什么?
不确定我是否完全理解,但您可以通过 javascript 将 UI 的值保存到表单上的隐藏元素中。这可以在他们选择 UI 中的值或提交表单时完成。假设 JQuery 在提交数据发送之前使用 submit() 保存的伪代码:
$('#myForm').submit(function(){
// get the value of your UI
var calendarValue = calendarWidget.getValue()
// #calendarData is the hidden field
$('#calendarData').val(calendarValue)
})
这显然需要 JS,但使用 UI 元素也是如此。
根据您将 Django Form 子类输出到 HTML 页面的方式,您有三个选项。
第一个根本不涉及形式。任何 html 表单输入都将在 request.POST 中结束,因此您可以在那里访问它们。没错,它们不会绑定到您的 Form 子类,因此您必须使用自定义表单构造函数手动注入该值,或者在使用 request.POST 实例化它之后在您的 Form 对象上设置一些属性。这可能是最不理想的选择,但我会提到它,以防您的用例真的不支持其他任何东西。
如果您在 HTML 中手动输出表单字段,则第二个是一个选项(即:使用而{{ myform.field }}
不仅仅是{{ myform }}
需要一个)。使用正确的名称和 ID 将这个隐藏字段添加到 Form 子类本身,确保它有一个隐藏的 django 表单小部件。如有必要,按照 Rob 的建议使用 javascript 填充隐藏字段。当表单发布后,它将像往常一样绑定到您的表单子类,因为这一次,您的表单子类上有一个具有该名称的字段。机器clean()
将正常工作。
第三个也是最好的选择是编写一个自定义的 django 字段;安德鲁的帖子有链接。Django 字段具有指定js
和css
要求的能力,因此您可以为使用日历小部件的任何页面自动封装这些依赖项。