繁体   English   中英

在 Django 的下拉更改中执行 Python 脚本?

[英]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 部分,如下所示:

主页.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"

视图.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/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')})

然后在您的网址中添加路径

网址.py

path('external/', views.external, name='external'),
path('external/load-data/', views.external_load_data, name='external_load_data'),

最后创建 html 模板

脚本加载数据.html

{{data1}}

我觉得这就是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM