Django:如何使用FormView和ajax将对象保存到数据库?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django:如何使用FormView和ajax将对象保存到数据库?相关的知识,希望对你有一定的参考价值。
我正在使用google maps api
构建应用程序,用户可以在地图上添加和保存标记。我使用ajax将包含标记属性的表单发送到后端。我正在使用django's
heleper FormView
:
ajax.js:
$(document).on('submit', '.add_marker_form', function(event){
event.preventDefault();
// parse form attributes:
// (irrelevent code here)
$.ajax({
method: 'POST', // or 'type'
url: '/map/saveMarker/',
data: data, // the four attributes
csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val()
success: function(data){
console.log("marker saved");
},
error: function(data){
console.log("marker not saved");
}
});
}) // document
forms.朋友
from django.forms import ModelForm
from .models import myModel
class SaveMarkerForm(ModelForm):
class Meta:
model = myModel
fields = ['title', 'url', 'latitude', 'longitude']
迷信.朋友
from django.http import JsonResponse
class AjaxFormMixin(object):
def form_invalid(self, form):
response = super(AjaxFormMixin, self).form_invalid(form)
if self.request.is_ajax():
return JsonResponse(form.errors, status=400)
else:
return response
def form_valid(self, form):
form.save()
response = super(AjaxFormMixin, self).form_valid(form)
if self.request.is_ajax():
data = {
'message': "Successfully submitted data."
}
return JsonResponse(data)
else:
return response
views.朋友
import requests
from django.views.generic.edit import FormView
from .forms import SaveMarkerForm
from .mixin import AjaxFormMixin
class SaveMarkerView(AjaxFormMixin, FormView):
form_class = SaveMarkerForm
template_name = 'map.html'
success_url = '/'
但是在提交表单后,对象不会保存在数据库中。如您所见,我将form.save()
添加到form_valid
方法,如下所示:
我也尝试使用UpdateView
,如下所示:
并尝试了其他解决方案,但没有一个有效。所以请帮帮我。我的代码中的问题在哪里?我错过了什么
答案
你是passing a CSRF token with the AJAX request吗?如果不是这可能是您的表单无效的原因。
这篇文章解释了如何include CSRF token in AJAX post。
以上是关于Django:如何使用FormView和ajax将对象保存到数据库?的主要内容,如果未能解决你的问题,请参考以下文章
Django:如何使用动态(非模型)数据预填充 FormView?
重定向到 django FormView 中的下一个 URL
python Django(极端情况):如何在FormView(CreateView / UpdateView)的form_valid方法中引发表单无效并添加错误消息