在Django中加载网页后调用动态python函数

时间:2014-07-08 00:50:30

标签: javascript python django django-templates

我在python中有一个函数,它将返回许多图像URL中的一个。我想在用django制作的网页上实现一个按钮,它会将图像的源更改为返回值。我遇到的问题是,只有在呈现页面时才能访问django模板标记,如here所述。由于真正的代码无法在javascript中重新创建,每次按下按钮时是否有解决方法来访问python函数的返回数据?

以下是一些代码来澄清我的问题:

class Foo(models.Model):
    def get_image_url():
        if(random.randint(0,1)):
            return 'http://img1.jpg'
        else:
            return 'http://img2.jpg'

如果可能的话,这就是我希望它在javascript中运行的方式。

function updateImage(){
    document.getElementById("testImage").src="{{ foo.get_image_url }}";
}

感谢。

1 个答案:

答案 0 :(得分:2)

听起来你必须使用AJAX。您可以定义一个Django视图,该视图返回一条JSON消息,其中包含:

{
    status: "ok",
    url: "img1.jpg"
}

因此,在您的代码中,您可以使用以下内容定义事件处理程序(在JavaScript中):

// Attach a listener to a button for a click event,
document.getElementById("testImageButton").addEventListener("click", function() {
    var xhr = new XMLHttpRequest();
    // This URL returns the above JSON.
    xhr.open("GET", "/images/random"); 
    xhr.onloadend = function() {
         // Should have error handling in case response does not return correctly.
         var imageResult = JSON.parse(xhr.response);
         if(imageResult['status'] == 'ok') {
             // update the image src
             document.getElementById("testImage").setAttribute("src", imageResult['url']);
         }
    }
    xhr.send()
})

因此唯一的“动态函数部分”是Django视图函数中的任何内容。