Django表单和表单集用于基于浏览器的经典数据发布 . 尽管它们绝对可以与Javascript一起使用,但是您希望从正常行为中分离得越多,它就越复杂 .
根据您的要求,您可能会开始考虑删除它并切换到Javascript REST endpoints . 当然,如果您需要渐进增强功能,并且您需要在没有javascript的情况下使用它,那么这不是一个选项 .
在任何情况下,您都希望有一个自定义视图用于从JS发布,以便您可以返回结果并在AJAX处理程序中轻松解析它 . 可能是一些JSON .
您可以采取几种方法 .
让您的AJAX将数据发送到其他URL . 如果您有API或计划在某个时刻构建一个API,这是相关的 . 因此,您的表单在正常提交时将执行旧式处理,但您的AJAX将与API endpoints 进行通信 .
例如,您的表单发送到 https://example.com/myform ,但您的Javascript代码在 https://example.com/api/v1/mymodel/ 处与REST api进行通信(根据需要发送PUT,POST和DELETE请求) .
或者如果你没有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中 .
你会发现's manageable if you just do this for one, maybe two views in your project, but very quickly you' ll想要一个小的API,特别是考虑到使用Django REST framework等软件包构建一个API是多么容易 .