2017-05-31 173 views
0

我有使用ajax的django網站。當我在HTML文檔<script>...</script>內使用JavaScript時,一切正常。但是,當我移動JavaScript來分開文件的一切(所有的JavaScript)工程很好,但阿賈克斯。在我得到的每一個ajax請求中:404 (Not Found)它總是顯示ajax開始的文檔的行。我的網址是這樣的:Django ajax在單獨的文件中不起作用

url(r'^(?P<letnik_id>[1-4])/(?P<classes_id>[A-G])/(?P<subject_id>[\w\-]+)/dodaj$', views.create_exam, name="create_exam"), 

在訪問量:

def create_exam(request, letnik_id, classes_id, subject_id): 
... 

和Ajax網址:

$.ajax({ 
    url: "{% url 'create_exam' letnik_id=letnik_id classes_id=classes_id subject_id=subject_id %}", 
... 

也許如果單獨的文件中{% url 'create_exam' letnik_id=letnik_id classes_id=classes_id subject_id=subject_id %}不會工作?但有沒有其他方式指向該網址? 我在做什麼錯?

回答

2

你回答了你自己的問題。在單獨的JS文件中,django模板標籤將不起作用。它只適用於由Django視圖呈現的模板。您可能需要尋找其他方法。

我不確定這是否是最好的方法,但您可以在模板中聲明一個全局js變量,然後在您的js文件中使用它。我真的不知道它是否是最好的方法,但我認爲它會起作用。

在你的HTML導入js文件之前,您聲明變量之前:

MY_URL = "{% url 'create_exam' letnik_id=letnik_id classes_id=classes_id subject_id=subject_id %}"; 
<script src="myscripts.js"></script> 
+1

這根本不是什麼好主意,雖然我已經解決了這個問題,但是不能兩天。我只是使用了:window.location.pathname +「create_exam」,因爲所有的參數都已經在url中。不管怎麼說,多謝拉! – csserrs

1

有什麼不對:

您正在嘗試使用Django模板標籤({%網址... %})在模板之外。

修復它:

你可以做類似傾倒了一堆數據到您的HTML並將其附加到window對象在瀏覽器

<script> 
window.page_data = { 
    someUrl: {% url ... %} 
}; 
</script> 

然後用另一腳本,訪問從窗口數據...

$.ajax(window.page_data.someUrl) 

或者,你可以嵌入在標記的URL與數據屬性

<div data-url="{% url ... %}"> 

然後從Javascript中的元素中提取它。

隨着項目日益複雜化,API應該傳遞您在資源上執行每個操作所需的數據。只需要謹防將您的客戶端與服務器不必要地耦合。也就是說,不要硬編碼url,因爲它們可能會改變,這會導致一些意外的破壞。如果你必須硬編碼任何東西,確保只在一個地方做,並在某個地方做一個註釋來解決這個問題。