1. 程式人生 > >Django + Ajax傳送POST表單,並將返回資訊回顯到頁面中

Django + Ajax傳送POST表單,並將返回資訊回顯到頁面中

將表單資料傳送回後端,然後處理後端返回的資訊並顯示在當前頁面中,這裡使用Ajax進行處理;

那麼先看js程式碼:

<!--以下為 Ajax指令碼 -->
    <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <script type="text/javascript">
    $(document).ready(function(){
     $("#save").click(function(){
     $.ajax({
         url:"/api/add_event/"
, #url type: "POST", #提交表單的型別,相當於method="post" dataType: "json", #dataType, 這個是請求後,返回的資料將以json格式顯示 data:{"name": $("#id_name").val(), #在"#"號後面是控制元件id, 所以千萬不要搞錯了,要不然會出大事的 "limit":$("#id_limit").val(), "address"
: $("#id_address").val(), "start_time": $("#id_start_time").val(), "status": $("#id_status").val(), }, #Data這個地方,必須要獲取資料,代表將獲取到的資料傳送到後端,後端再進行處理 success:function(data){ console.log(data); #除錯使用 console.log(data.status); #除錯使用 console.log(data.message); #除錯使用 $(".text"
).text(data.message); #將後端返回到結果通過前端頁面進行展示 }, #注意標點 }); #需要注意標點符號,如果標點符合錯誤了,那ajax基本上都不會執行(否則,後果很嚴重哦) }); #注意標點 }); #注意標點
</script>


注意(踩過的坑):

1.contentType: "application/json" ——>加入該語句時,在後端print(request.POST)時無法獲取內容,相當於後端根本拿不到資料。因此在網上搜索瞭解到,使用contentType: “application/json”則data只能是json字串;不使用時contentType一般為預設的application/x-www-form-urlencoded格式, 因此如果不限制 POST格式,乾脆就不寫。
2. 說說“data”這裡面需要注意:data:{"name", $("#id_name").val(), } 這其中id_name必須為控制元件的id 名稱,使用其它的則不能獲取的資料,這個還是得注意。
3. 標註符號,標點符號,標點符號,重要的事情說三遍,當然可以藉助專門的編輯器(我主要是懶哦,哈哈)
4. $(".text").text(data.message); 回顯在html中,是對後端返回的資料進行處理
那行回顯在網頁面上面

<font color="red">
<span class="text"></span>
</font>

以下為html程式碼

<div class="container">
    <div class="col-md-4 col-md-offset-4">
        <form id="form1" onsubmit="return false" action="##" method="POST" class="form-horizontal">

        <!--此處就是通過後端返回到前端,前端進行展示-->
            <font color="red">
                <span class="text"></span>
            </font>

            <div class="form-group">
                <label for="id_name">釋出會名稱:</label>
                <input type="text" name="name" class="form-control" placeholder="釋出會名稱" maxlength="128" required id="id_name" />
            </div>
            <div class="form-group">
                <label for="id_limit">Limit:</label>
                <input type="number" name="limit" class="form-control" required id="id_limit" />
            </div>
            <div class="form-group">
                <label for="id_address">釋出會地址:</label>
                <input type="text" name="address" class="form-control" placeholder="地址" maxlength="128" required id="id_address" />
            </div>
            <div class="form-group">
                <label for="id_start_time">開始日期:</label>
                <input type="text" name="start_time" required id="id_start_time" />
            </div>

            <div class="form-group">
                <label for="id_status">釋出狀態:</label>
                <select name="status" id="id_status">
                  <option value="blank">-----</option>
                  <option value="1">True</option>
                  <option value="0">False</option>
                </select>
            </div>

            <div align="center">
             <input  class="btn btn-lg btn-primary" id="save"  type="submit" value="儲存釋出會" ></input >
            </div>
        </form>
    </div>
</div>

現在來看一下後端的程式碼:

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def add_event(request):
    if request.is_ajax():
        print(request.body)
        print(request.POST)

        name = request.POST.get('name', '')  # 釋出會名稱
        limit = request.POST.get('limit', '')  # 限制人員
        status = request.POST.get('status', '')  # 釋出會狀態
        address = request.POST.get('address', '')  # 釋出會地址
        start_time = request.POST.get('start_time', '')  # 釋出會時間

        if name == '' or limit == '' or status == '' or start_time == '':
            return JsonResponse({'status': 10021, 'message': 'parameter error'})

        # 判斷髮佈會名稱重複
        result = Event.objects.filter(name=name)
        if result:
            return JsonResponse({'status': 10023, 'message': 'event name already exists'})

        if status == '':
            status = 1

        try:
            # Event.objects.create(id = eid, name = name, limit = limit, address = address, status = int(status), start_time=start_time)
            Event.objects.create(name=name, limit=limit, address=address, status=int(status), start_time=start_time)
        except ValidationError as e:
            error = 'start_time format error. It must be in YYYY-MM-DD HH:MM:SS'
            return JsonResponse({'status': 10024, 'message': error})
        return JsonResponse({'status': 200, 'message': 'add event success'})
  1. 在後端處理時,我們需要加入:@csrf_exempt 標記,所以導包from django.views.decorators.csrf import csrf_exempt,否則會出現錯誤csrf_token錯誤 (403)
  2. request.is_ajax()判斷當前是否是使用ajax 進行表單提交
  3. django request.POST / request.body
    當request.POST沒有值 需要考慮:
    1.請求頭中的: Content-Type: application/x-www-form-urlencoded request.POST中才會有值(才會去request.body中解析資料),關於Content-Type前面也提到,不寫的錯誤,它就是預設。
    request.body的請求資料
    b’name=%E5%A4%BA%E5%A4%BA&limit=123‘

    request.POST的資料,django已進行自動處理
    QueryDict: {‘name’: [‘奪奪’], ‘limit’: [‘123’]