[英]Dynamically add form to formset in Django and submit with AJAX
我已经阅读了很多有关如何在Django中将表单动态添加到模型表单集中并可以成功实现的答案。 但是,我现在想使用AJAX提交表单集。 现在大多数方法都可以使用,但是我有一个问题,在其他任何答案中都找不到解决方案:
如果将表单动态添加到表单集中,则给它一个新的表单ID号,该ID号比当前表单的最大ID大一个,并且还将管理TOTAL_FORMS计数增加1。 然后,新添加的表单成功保存为新对象。
我正在尝试通过AJAX提交,以便用户可以继续编辑而无需刷新页面。 表单集可以很好地保存,但是任何动态添加的表单现在都是现有对象。 为了解决这个问题,保存成功后,我需要增加管理表单上的INITIAL_FORMS计数。 很简单。 但是,我也意识到我需要给新创建的对象一个ID,因为它们现在存在于数据库中。
我如何获得视图以在响应AJAX调用时告诉我新对象的ID? 还是有更好的方法来查看此内容?
Django表单和表单集旨在用于基于浏览器的经典数据发布。 尽管绝对可以使它们与Javascript一起使用,但您想要从正常行为中脱身的越多,它就变得越复杂。
根据您的要求,您可能会开始考虑删除它并切换到Javascript + REST端点。 当然,如果您需要渐进式增强功能,并且需要在不使用javascript的情况下运行它,那么这不是一个选择。
无论如何,您都希望有一个自定义视图以便从JS发布,以便可以将结果取回并轻松地在AJAX处理程序中对其进行解析。 可能是一些JSON。
您可以采取几种方法。
让您的AJAX将数据发送到其他URL。 如果您有一个API或计划在某个时候构建一个API,则这是相关的。 因此,您的表单在正常提交后会进行旧式处理,但是您的AJAX会改为与API端点通信。
例如,您的表单发送到https://example.com/myform
,但是您的Javascript代码通过https://example.com/api/v1/mymodel/
与REST api对话(适当时发送PUT,POST和DELETE请求) )。
或者,如果您没有API并且构建一个API似乎有些过时,则可以更改视图,以便根据数据是按常规方式还是使用AJAX提交,对输出进行不同的格式设置。
您可以这样处理:
class MyFormView(.....): def render_to_response(self, context, **kwargs): if self.request.is_ajax(): return self.render_to_json(context, **kwargs) return super().render_to_response(context, **kwargs) def render_to_json(context, **kwargs): data = { # see below! } return HttpResponse( content=json.dumps(data).encode('ascii'), content_type='application/json', )
这只是一个大纲。 您需要确保is_ajax
可以正确检测到它(请参阅django doc )。 而且您需要从context
正确构建data
:提取要发送回JS代码的内容,并将其放入dict中。
如果只为项目中的一个或两个视图执行此操作,您将发现它是可管理的,但是很快您将需要一个小的API,尤其是考虑到使用Django REST框架之类的程序包构建一个API的简易性时。
在您的视图中,保存对象的位置,保存之后,object.id将包含该对象的新ID,您可以通过json返回该ID,也可以在ajax响应中返回该ID,然后是,您需要填写将其放入表单集行,以便下次提交。
您需要注意的一件事是django期望所有现有行都在表单集的顶部,而任何新行都在表单集的底部。 否则,表单集保存将抱怨缺少ID。 因此,如果您要在javascript中进行任何排序,则不能这样做。.除非您对表格集中的所有字段名称进行了大量固定。 表单集代码使用管理表单中的数字来确定要插入的行和要更新的行,它不会根据是否存在id来执行此操作。 不幸...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.