我正在尝试使用AJAX提交大型django表单。 (我在AJAX中使用post方法。如果此信息与此相关)
如果我像下面那样执行serializeArray(),那么我会得到一个Json String。
formData = JSON.stringify($('#add_member_Form').serializeArray());
像这样 -
[{"name":"csrfmiddlewaretoken","value":"tZYajDy9XlzpQSyNwCXHY58S0fdI7BQS"},{"name":"first_name","value":"dajk"},{"name":"last_name","value":"khjk"},{"name":"gender","value":"2"}]
然后在服务器端我使用json.loads()
将其转换为列表。但在这个过程中,我正在失去数据类型。例如,在上面的数据中,gender
是一个整数,但它被转换为字符串
有没有办法使用AJAX发送此表单数据并保留每个字段的数据类型(数字在django视图中接收时保持整数)?
答案 0 :(得分:1)
将数据发送到服务器时,服务器将始终以字符串形式接收/处理数据。除非您使用Django表单来处理数据。在这种情况下,Django将完成魔术并将所有内容转换为正确的类型。
如果您使用AJAX发送数据,您可以使用$('#add_member_Form').serialize()
代替$('#add_member_Form').serializeArray()
,如下所示:
$.ajax({
url: 'members/new/',
type: 'post',
data: $('#add_member_Form').serialize(),
success: function (data) {
// do whatever with the data
}
});
现在考虑你在HTML中有以下输入:
您将能够像这样检索此数据:
def add_member(request):
first_name = request.POST.get('first_name')
last_name = request.POST.get('last_name')
try:
gender = int(request.POST.get('gender')) # try to convert the string to int
except ValueError: # the post data was not a valid integer
gender = 1 # fallback to a default value? the ideal case would run a validation using a proper Form
member = Member.objects.create(first_name=first_name, last_name=last_name, gender=gender)
return redirect('members_list')
但是你可以更进一步使用Django表格,如下所示:
from django import forms
from .models import Member
class MemberForm(forms.ModelForm):
class Meta:
model = Member
fields = ('first_name', 'last_name', 'gender', )
然后在视图中,您可以简单地执行以下操作:
def add_member(request):
if request.method == 'POST':
form = MemberForm(request.POST) # here Django will process your form, convert all the data types
if form.is_valid(): # Then you can save the data that came from the Ajax request, or do whatever
form.save()
return redirect('members_list')
else:
form = MemberForm()
return render(request, 'add_member.html', {'form': form})