Ajax 如何处理django表单中的复杂图形UI元素?

Ajax 如何处理django表单中的复杂图形UI元素?,ajax,django,django-forms,Ajax,Django,Django Forms,我有一些复杂的GUI元素(比如可以突出显示许多天的自定义日历)与标准django表单输入字段一起出现。我想处理来自这些复杂表单和Django表单的数据I/O 以前,在保存或呈现Django表单后,我会使用AJAX请求在HTML表单上处理这些自定义GUI元素,但这会导致大量问题和自定义AJAX编码。在Django表单中处理复杂交互小部件的好方法是什么?我不确定是否完全理解,但您可以通过javascript将UI的值保存到表单上的隐藏元素中。这可以在用户界面中选择值时完成,也可以在提交表单时完成。伪

我有一些复杂的GUI元素(比如可以突出显示许多天的自定义日历)与标准django表单输入字段一起出现。我想处理来自这些复杂表单和Django表单的数据I/O


以前,在保存或呈现Django表单后,我会使用AJAX请求在HTML表单上处理这些自定义GUI元素,但这会导致大量问题和自定义AJAX编码。在Django表单中处理复杂交互小部件的好方法是什么?

我不确定是否完全理解,但您可以通过javascript将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元素也需要JS。

不确定我是否完全理解,但您可以通过javascript将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元素也需要JS。

您的问题非常模糊,因此我建议您阅读上的Django文档,希望这能帮助您入门。您可能还想研究编写自定义小部件。不幸的是,这方面的文档有点缺乏,但是谷歌搜索会带来一些有用的博客帖子,包括。

你的问题非常模糊,因此我建议你阅读上的Django文档,希望这能帮助你开始。您可能还想研究编写自定义小部件。不幸的是,这方面的文档有点缺乏,但是谷歌搜索会带来一些有用的博客帖子,包括。

根据如何将Django表单子类输出到HTML页面,您有三个选项

第一个根本不涉及形式。任何html表单输入都将在request.POST中结束,因此您可以在那里访问它们。是的,它们不会绑定到表单子类,因此您必须使用自定义表单构造函数手动注入值,或者在使用request.POST实例化表单对象后,在表单对象上设置一些属性。这可能是最不理想的选择,但我提到它是为了防止您的用例真的不支持其他任何东西

第二个选项是在HTML中手动输出表单字段(即:使用
{{myform.field}
而不仅仅是
{myform}
),在这种情况下,创建一个隐藏变量来包含日历GUI工具的值(很可能,GUI工具已经提供/需要一个)。使用正确的名称和ID将此隐藏字段添加到表单子类本身,确保它有一个隐藏的django表单小部件。如有必要,按照Rob的建议使用javascript填充隐藏字段。发布表单时,它会像正常情况一样绑定到表单子类,因为这一次,表单子类上有一个包含该字段的字段名称。
clean()
的机器将正常工作


第三个也是最好的选择是编写一个自定义django字段;Andrew的帖子中有这个链接。django字段能够指定
js
css
要求,因此您可以为使用日历小部件的任何页面自动封装这些依赖项。

根据您的输出方式,您有三个选项Django表单子类到HTML页面

第一个根本不涉及表单。任何html表单输入都将在request.POST中结束,因此您可以在那里访问它们。确实,它们不会绑定到您的表单子类,因此您必须使用自定义表单构造函数手动注入值,或者在使用request.POST.t实例化表单对象后,在表单对象上设置一些属性他的可能是最不可取的选择,但我提到它的情况下,您的用例真的不支持任何其他东西

第二个选项是在HTML中手动输出表单字段(即:使用
{{myform.field}
而不仅仅是
{myform}
),在这种情况下,创建一个隐藏变量来包含日历GUI工具的值(很可能,GUI工具已经提供/需要一个)。使用正确的名称和ID将此隐藏字段添加到表单子类本身,确保它有一个隐藏的django表单小部件。如有必要,按照Rob的建议使用javascript填充隐藏字段。发布表单时,它会像正常情况一样绑定到表单子类,因为这一次,表单子类上有一个包含该字段的字段名称。
clean()
的机器将正常工作

第三个也是最好的选择是编写一个定制的django字段;Andrew的帖子中有链接。django字段能够指定
js
css
要求,因此您可以为使用日历小部件的任何页面自动封装这些依赖项