[英]Executing Python script on dropdown change in Django?
我有一个简单的 Python 脚本simple_script.py
,它只打印一个带有当前日期时间的字符串:
import datetime
print(f"Current time is: {datetime.datetime.now()}")
脚本文件放置在 django 项目主文件夹中名为scripts
的文件夹中。
在网站上,我只有一个下拉字段 ( <select>
) 和一个按钮。 我希望每次用户更改下拉字段时都运行此脚本,即无需按下按钮(按钮甚至不是必需的 - 它仅用于演示目的)。 我设法实现了运行脚本取决于按下按钮的版本。
我家html:
<form action="/external/" method="post">
{% csrf_token %}
<select>
<option>---</option>
<option>1</option>
<option>2</option>
<option>3</option>
</select><br><br>
{{data1}}<br><br>
<input type="submit" value="Execute Custom Py Script">
</form>
我的意见.py:
import sys
from django.shortcuts import render
from subprocess import run, PIPE
def external(request):
out = run([sys.executable, "scripts/simple_script.py"], shell=False, stdout=PIPE)
return render(request, 'appName/home.html', {'data1': out.stdout.decode('utf-8')})
我在url.py
中添加了以下路径声明:
path('external/', views.external, name='external'),
现在,按下按钮后, {{data1}}
标签会被simple_script.py
返回的字符串填满。 为了达到我的目标,我意识到我可能需要 JavaScript,所以我在<select>
标记中添加了一个onChange
属性,如下所示: <select onChange="runSimpleScript()">
。
我的疑问是,如何在我的 HTML 文件和 views.py 之间创建相同类型的绑定,Django 使用 Django 模板语言如此方便地提供? 如何使用 JavaScript 运行脚本,并将脚本的 output 返回到 HTML 模板?
您必须使用 django 信息重新渲染您想要更改的 html 部分,如下所示:
<form action="/external/" method="post">
{% csrf_token %}
<select onchange=runSimpleScript()>
<option>---</option>
<option>1</option>
<option>2</option>
<option>3</option>
</select><br><br>
<div id="data-from-script">
{{data1}}
</div>
<br><br>
<input type="submit" value="Execute Custom Py Script">
</form>
<script>
function runSimpleScript() {
let xhttpRequest = new XMLHttpRequest()
xhttpRequest.onreadystatechange = function (data) {
if (this.readyState === 4 && this.status === 200) {
document.getElementById("data-from-script").innerHTML = this.response
}
}
xhttpRequest.open("GET", "./external/load-data/", true)
xhttpRequest.send()
}
</script>
所以你必须创建一个单独的视图来只渲染你想要的模板部分,在这种情况下是 div "data-from-script"
import sys
from django.shortcuts import render
from subprocess import run, PIPE
def external(request):
out = run([sys.executable, "scripts/simple_script.py"], shell=False, stdout=PIPE)
return render(request, 'appName/script.html', {'data1': out.stdout.decode('utf-8')})
def external_load_data(request):
out = run([sys.executable, "scripts/simple_script.py"], shell=False, stdout=PIPE)
return render(request, 'appName/script-load-data.html', {'data1': out.stdout.decode('utf-8')})
然后在您的网址中添加路径
path('external/', views.external, name='external'),
path('external/load-data/', views.external_load_data, name='external_load_data'),
最后创建 html 模板
{{data1}}
我觉得这就是。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.