2016-10-18 25 views
0

我想用AJAX提交一個大型的django表單。 (我在AJAX中使用post方法,如果這裏的信息是相關的)如何保留通過AJAX提交的django表單中的數據類型

如果我像下面那樣執行serializeArray(),那麼我得到一個Json字符串。

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

將數據發送到服務器時,服務器將始終以字符串的形式接收/處理它。除非你使用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})