我想你對一個CSRF問題跑起來。由於Django默認阻止了沒有使用403的CSRF令牌的POST請求。在JS中有幾種方法可以解決這個問題。一是拉動值從cookie的,代碼要做到這一點可以在這裏找到:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax
,或者您可以通過將CSRF_TOKEN中使用JavaScript腳本標籤做到這一點:
<script src='myjavascript.js?CSRF_TOKEN={{ csrf_token }}'></script>
注它使用的是雙重大括號,而不是{%%}。這會獲取令牌的值,而不是表單輸入。
function getOptionsFromScriptSrc() {
// Get last script tag in parsed DOM.
// Due to the way html pages are parsed,
// the last one is always the one being loaded.
var options = {}
var js_src = $('script').last().attr('src');
if(js_src.match(/\?/)) {
var options_list = js_src.split('?')[1].split('&');
for(var i = 0; i < options_list.length; i++) {
var tmp = options_list[i].split('=');
options[$.trim(tmp[0])] = $.trim(tmp[1]);
}
}
return options;
}
function get_asset_from_type(){
var options = getOptionsFromScriptSrc();
var type_asset = $("#id_type").val();
var data = {type_asset: type_asset, csrfmiddlewaretoken: options['CSRF_TOKEN']};
var args = {type:"POST", url:"/asset/etatType/", data:data};
$.ajax(args);
alert(type_asset);
return false;
};
我當然沒有測試過這個代碼,但是我之前用過這個方法,它工作得很好。
要填充一個選擇框的主要問題,你需要指定你的AJAX後回調,然後處理從服務器返回的數據:
function get_asset_from_type(){
var options = getOptionsFromScriptSrc();
var type_asset = $("#id_type").val();
var post_data = {type_asset: type_asset, csrfmiddlewaretoken: options['CSRF_TOKEN']};
$.post('/asset/etatType/', post_data, function(data){
// Assuming server is going to respond with the html of the options, eg: <option value="1">One</option><option value="2">Two</option>...
$('#id_ofmyselectbox').append(data);
});
};
好像不有一個錯誤了。謝謝!現在我仍然有下拉列表問題的人口。沒有線索從哪裏開始.. – Johanna
啊。我只注意到你的.ajax調用沒有回調。每當你有一個Ajax請求時都需要回調,因爲請求是異步的。當服務器響應時,回調就會運行。幾件事:1.我會使用$ .post(http://api.jquery.com/jQuery.post/)而不是$ .ajax,它只是一個小清潔工。 2.你的服務器將回應什麼? JSON,XML,HTML? –
我的服務器將用HTML做出響應,至少現在至少有 – Johanna