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

1 投票
1 回答
1190 浏览
提问于 2025-04-18 12:26

我在用Python写一个函数,这个函数会返回很多图片的链接。我想在用Django做的网页上加一个按钮,点击这个按钮后,网页上的图片就能换成这个函数返回的链接。不过,我遇到了一个问题,就是Django的模板标签只能在页面渲染的时候使用,具体情况可以参考这里。因为真实的代码不能在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 个回答

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视图函数里面的内容。

撰写回答