我正在开发一个python django网络应用程序,我希望在其中实现国际化并将整个应用程序自动翻译成法语或中文。
我参考了这个网站https://www.metod.io/en/blog/2015/05/05/django-i18n-part-1/
但每当我尝试运行该应用时,都会显示以下错误:
500:/ en / get_dashboard_data /视图中的ValueError dashboard.views.getDashboardData未返回HttpResponse对象。 它改为返回None。
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 :(得分:3)
这就是为什么你应该真正练习更多的防御性编程。虽然您坚持请求方法是POST并且它是ajax并且操作是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 :(得分:0)
我的猜测是你的JavaScript确实向/en/get_dashboard_data/
发出POST请求,但由于某种i18n中间件,它会收到/en/get_dashboard_data/
的重定向响应(HTTP 301或302)。
浏览器遵循重定向,但对<script>var dashBoardDataUrl = "{% url "name-of-dashboard-url" %}"</script>
的新请求是GET请求。
编辑:
当遵循重定向时,浏览器将始终执行第二个请求作为GET,没有办法阻止它。您有几种方法可以解决这个问题:
向正确的应用程序发出初始请求。这意味着您必须将i18n URL传递给JavaScript而不是硬编码。您可以在模板中添加以下内容:
{{1}}
因为您的“操作”只是获取代码,您可以接受GET请求并从查询参数中读取操作