2016-09-15 131 views
0

我正在研究一個python django web應用程序,我想在其中實施國際化並將整個應用程序自動轉換爲法語或中文。查看未返回響應

我參考了從該網站https://www.metod.io/en/blog/2015/05/05/django-i18n-part-1/

但每當我嘗試運行應用程序它顯示了這個錯誤:

​​

和URL get_dashboard_data通過AJAX獲取數據。

url(r'^get_dashboard_data/$', views.getDashboardData, name='getDashboardData'), 

視圖

@login_required(login_url='/') 
def getDashboardData(request): 
    dbname = request.user.username 
    if request.method == 'POST' and request.is_ajax(): 
     if request.POST.get('action') == 'sale_chart_data': 
      data = DashboardData(dbname).getSaleChartData() 
      channel_list = data[0] 
      data_list = data[1] 
      print 123, data_list, channel_list 
      return HttpResponse(json.dumps({'channel_list':channel_list, 'data_list':data_list}), content_type='application/json') 

     if request.POST.get('action') == 'get_sale_numbers': 
      sale_data = DashboardData(dbname).getSaleNumbers() 
      return HttpResponse(json.dumps({'sale_number_data':sale_data}), content_type='application/json') 

     if request.POST.get('action') == 'get_inventory_numbers': 
      inventory_data = DashboardData(dbname).getInventoryData() 
      return HttpResponse(json.dumps({'inventory_data':inventory_data}), content_type='application/json') 

     if request.POST.get('action') == 'get_order_numbers': 
      order_data = DashboardData(dbname).getOrderData() 
      return HttpResponse(json.dumps({'order_data':order_data}), content_type='application/json') 

     if request.POST.get('action') == 'get_hourly_data': 
      order_data = DashboardData(dbname).getHourlyData() 
      sale_data = order_data[1] 
      count_data = order_data[0] 
      return HttpResponse(json.dumps({'sale_data':sale_data, 'count_data':count_data}), content_type='application/json') 

     if request.POST.get('action') == 'top_performers': 
      data = DashboardData(dbname).getTopPerformers() 
      inventory_count_dict = data[0] 
      current_month_dict = data[1] 
      last_month_dict = data[2] 
      current_quarter_dict = data[3] 
      current_year_dict = data[4] 
      channel_list = data[5] 
      return HttpResponse(json.dumps({'inventory_count_dict':inventory_count_dict,'current_month_dict':current_month_dict,'last_month_dict':last_month_dict,'current_quarter_dict':current_quarter_dict,'current_year_dict':current_year_dict,'channel_list':channel_list}), content_type='application/json') 

     if request.POST.get('action') == 'top_products': 
      product_data = DashboardData(dbname).getTopProducts() 
      return HttpResponse(json.dumps({'product_data':product_data}), content_type='application/json') 

的JavaScript

function getSaleChart(){ 
    $.ajax({ 
     url : "/get_dashboard_data/", 
     type : "POST", 
     data : {action:'sale_chart_data'}, 

     success : function(response) { 
      channel_list = response.channel_list; 
      data_list = response.data_list; 
      c3.generate({ 
       bindto: '#sale-chart-30-days', 
       data:{ 
        x: 'dates', 
        xFormat: '%b %d', 
        columns: data_list, 
        colors:{ 
         Flipkart: '#1AB394', 
         Paytm: '#BABABA' 
        }, 
        type: 'bar', 
        groups: [ channel_list ] 
       }, 
       axis: { 
        x: { 
         type: 'timeseries' 
        } 
       } 
      }); 
     }, 

     error : function(xhr,errmsg,err) { 
      toastr["error"]("Something Broke.", "Oops !!!."); 
      console.log(xhr.status + ": " + xhr.responseText); 
     } 
    }); 
} 
+0

該錯誤與您在此顯示的任何代碼無關,應顯示您的視圖。或者只是看看它。確保該視圖中的每條路徑都返回一個響應。 – Sayse

+0

@Sayse實際上,如果我不包括i18n包,那麼該應用程序工作得很好,並返回響應,但是當我添加i18n包時,它顯示錯誤 – User0706

+0

它會工作正常,因爲無論您所做的任何更改使視圖通過視圖邏輯採取不同的路線。 – Sayse

回答

3

這就是爲什麼你應該多練習防禦性編程。雖然你堅持請求方法是POST,並且它是ajax,並且action是sale_chart_data,但三者之一不是你所期望的。

你的功能真的應該如下。這是一個很好的習慣。

def getDashboardData(request): 
    dbname = request.user.username 
    if request.method == 'POST' and request.is_ajax(): 
     action = request.POST.get('action') 
     if action == 'sale_chart_data': 
      data = DashboardData(dbname).getSaleChartData() 
      .... 
     ... 
     # other if conditions here 
     else : 
      return HttpResponse(json.dumps({'message':'Unknown action {0}'.format(action)}), content_type='application/json') 

    else : 
      return HttpResponse(json.dumps({'message':'Only ajax post supported'}), content_type='application/json') 

然後你應該設置斷點並評估請求以確定在這個特定請求中究竟發生了什麼。

+1

@Sayse是的,非常好的主意 – e4c5

+1

而不是一個普通的HttpResponse,我會建議返回一個[HttpResponseBadRequest](https://docs.djangoproject.com/en/) 1.10/ref/request-response /#django.http.HttpResponseBadRequest),以及壞請求。 –

+0

@DanielHepper對吧。如果我們想深入挖掘,那麼我們也可以用JsonResponse替換HttpResponse。 – e4c5

0

我的猜測是你的JavaScript確實會向/get_dashboard_data/發出POST請求,但由於某種國際化中間件,它會收到一個重定向響應(HTTP 301或302)到/en/get_dashboard_data/

瀏覽器遵循重定向,但/en/get_dashboard_data/的新請求是GET請求。

編輯:

以下重定向時,瀏覽器將始終執行爲獲得第二個請求,沒有辦法防止。你有幾個選擇來解決這個問題:

  • 作出最初的請求到正確的應用程序。這意味着您必須將您的i18n網址傳遞到您的JavaScript中,而不是對其進行硬編碼。您可以添加這樣的事情到您的模板:

    <script>var dashBoardDataUrl = "{% url "name-of-dashboard-url" %}"</script>

  • 爲您的「動作」剛剛得到的代碼,你可以只接受一個GET請求,並讀取查詢paramters

  • 拆分查看操作到接受GET請求的幾個較小的視圖中,以便您擁有類似於REST API的內容。
+0

是的,您的新請求是GET請求。你可以建議如何解決這個問題? – User0706

+0

請看我編輯 –