我有使用ajax的django网站。当我在html文档<script>...</script>
中使用javascript时,一切正常。但是当我将javascript移动到单独的文件时(所有javascript)工作得很好,但是ajax。在每个ajax请求中,我得到:404 (Not Found)
并且它总是显示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 %}
不起作用?但有没有其他方法指向网址?
我做错了什么?
答案 0 :(得分:2)
你回答了自己的问题。在单独的JS文件中,django模板标记将不起作用。它仅适用于Django视图呈现的模板。您可能需要找到另一种方法。
我不确定这是否是最佳方法,但您可以使用url在模板中声明一个全局js变量,然后在js文件中使用它。我真的不知道它是否是最好的方法,但我认为它会起作用。
在您声明变量之前导入js文件之前的html中:
{{1}}
答案 1 :(得分:1)
出了什么问题:
您正尝试在模板之外使用Django Template标记({%url ...%})。
修复它:
您可以执行类似将大量数据转储到HTML中并将其附加到浏览器中的窗口对象的操作
<script>
window.page_data = {
someUrl: {% url ... %}
};
</script>
然后使用您的其他脚本,从窗口访问数据......
$.ajax(window.page_data.someUrl)
或者,您可以使用数据属性
在URL中嵌入URL<div data-url="{% url ... %}">
然后从Javascript中的元素中提取它。
随着项目复杂性的增加,您的API应传递您在资源上执行每个操作所需的数据。请注意不必要地将客户端与服务器耦合。也就是说,不要硬编码网址,因为它们可能会改变,这会导致一些意想不到的破坏。如果你需要对任何东西进行硬编码,请确保只在一个地方进行硬编码并在某个地方做一个注释来解决这个问题。