我有一個模型,并且該模型正在更新一個函式。我想動態顯示這個模型的資料。因此,應該在不重繪 頁面的情況下顯示新值。我該怎么做?
模型.py
class MyLongProcess(models.Model):
active_uuid = models.UUIDField('Active process', null=True, blank=True)
name = models.CharField('Name', max_length=255)
current_step = models.IntegerField('Current step', default=0)
total = models.IntegerField('Total', default=0)
@property
def percentage_sending(self):
# or it can be computed by filtering elements processed in celery with complete status
return int((current_step / total) * 100)
視圖.py
def setup_wizard(request):
process = MyLongProcess.objects.create(active_uuid=uuid.uuid4(), name=name, total=100)
functions.myClass(..., process=process)
....
return render(request, 'setup_wizard.html', context)
函式.py
class myClass():
def __init__(self, ..., process):
self.download_all(..., process=process)
@app.task(bind=TRUE)
def download_all(self, ..., process):
....
for s in scans:
....
process.current_step = 1
process.save()
...
setup_wizard.html
<div class="progress-bar" role="progressbar"
style="width: {{ my_model_object.percentage_sending }}%;"
aria-valuenow="{{ my_model_object.percentage_sending }}"
aria-valuemin="0" aria-valuemax="100">{{ my_model_object.percentage_sending }}%
</div>
我所有的功能都可以正常作業。當我MyLongProcess從 Django admin查看并重繪 頁面時,值正在更新。只是我想在不重繪 的情況下在前端顯示它。
uj5u.com熱心網友回復:
這不是 Django 的目的。本質上,它呈現靜態 HTML 內容,僅此而已。在像這樣的耗時函式中,您想要做的是首先呈現一些初始內容(假設進度為 0),然后異步通知前端。這可以通過兩種方式完成。第一種方法顯然更容易實作,但在資源上稍微難一些 - 即輪詢。本質上,您在 urls.py 中創建了一個特殊的端點,當訪問該端點時,它將為您提供您所追求的作業的百分比。那么你可以有一個 javascript 代碼,它必須setInterval( (js-code), 1000)每秒重繪 進度。只是為了給你一個概述如何實作:
document.addEventListener("DOMContentLoaded", function(event) {
var myElement = document.getElementById('my-element');
var task_id = myElement.getAttribute('data-task_id');
setInterval(function() {
var progressReq = new XMLHttpRequest();
progressReq.addEventListener("load", function() {
myElement.setAttribute('aria-valuenow', this.responseText);
});
progressReq.open("GET", "/progress-query/?task_id=" task_id);
progressReq.send();
}, 1000);
});
在 jQuery 的幫助下,HTTP 請求確實可以看起來更好,但我只想讓您了解它的外觀。
為了使其正常作業,您必須修改 html 模板以包含 id,如下所示:
<div ... data-task_id="some-task-id" />
如果您想在此處發布與模型相關的值,請記住對它們進行哈希處理,以免不小心發布原始資料庫 PK 或類似內容。
第二種實作起來稍微復雜一點的方法是使用 websockets。這意味著當前端啟動時,它會監聽通過后端 websocket 實作發送給它的事件。這樣,您幾乎可以實時而不是每秒更新進度。在這兩種方法中,javascript 代碼都必須訪問您想要更新的元素 - 通過var element = document.getElementById( ... )(這意味著您必須有一個 id 開始)或在 jQuery 的幫助下。那么你可以更新,像這樣的值:element.setAttribute('aria-valuenow', 10)。當然,在像 jQuery 這樣的庫的幫助下,您的代碼可以看起來比這更好。
ps 不要忘記(如果您通過輪詢方法)在進度達到 100 時中斷 setInterval 回圈 :-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/386010.html
標籤:javascript Python html 姜戈 阿贾克斯
上一篇:獲取請求后無法更新狀態
