如何保留通过AJAX提交的django表单中的数据类型

时间:2016-10-18 18:28:15

标签: json ajax django

我正在尝试使用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视图中接收时保持整数)?

1 个答案:

答案 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中有以下输入:

  • 如first_name
  • 姓氏
  • 性别

您将能够像这样检索此数据:

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})