如何通过Django HTML按钮执行Python代码?

6
我希望通过点击按钮来执行我的Python代码。在运行服务器后,我可以得到结果。但是我的按钮不起作用。以下是我的代码。
URL -
url(r'^index/$', index),

index.html-

<html>
<body>
  <form action="/index/" method="GET">
    <input type="submit" value="Click">
  </form>
  {{output}}
</body>
</html>

views.py -

from django.shortcuts import render, render_to_response
from pythoncode import mycode
def index(request):
    if request.method=="GET":
        py_obj=mycode.test_code(10)
        py_obj.code()
        return render(request, 'index.html', {"output":py_obj.a})

我创建了一个应用程序来分离Python代码 - 应用程序名称是“Python代码”,文件名为“mycode”。
class test_code:
    def __init__(self, a):
        self.a=a
        self.b=4
    def code(self):
        return self.a, self.b

请帮助我,我是Django的新手。提前谢谢。


1
请对您的代码进行格式化。 - Brandon Taylor
2
具体是什么错误? - Brandon Taylor
我想在单击“点击”按钮后执行mycode.py文件,并在模板上显示输出10。在上面的示例中,当我重新加载页面时,我会得到输出10。 - user3891137
1
根据您的观点,{{ output }} 的值将在每个 GET 请求中都存在,而不仅仅是在提交表单后。如果您的 HTML 正确无误,则在 </form> 标签上缺少一个闭合角括号。 - Brandon Taylor
1个回答

9
如果您只想在页面上点击并显示某些内容,则需要使用JavaScript和AJAX。没有必要为一个按钮创建整个表单。完全删除您的表单,同时关闭标签也是错误的(请阅读Brandon的评论)。
您可以在index.html中使用以下代码片段:
<button id="myClickButton" type="button">Click</button>
<div id="myOutput"></div>

现在让我们在点击按钮时触发一些事件:
$("#myClickButton").click(function() {
    $.get("/output/", function(data) {
        $("#myOutput").html(data);
    }, "html");
});

上面的代码是jQuery。请阅读jQuery的官方文档,里面详细讲解了如何使用这个库。

现在我们来看看你的views.py文件。

def index(request):
    return render(request, 'yourapp/index.html')

请记得将您的模板放置在应用程序中的templates文件夹中。应该长成这个样子:

--yourproject
|
|--yourapp
|----templates
|------yourapp
|--------index.html

在您的views.py中创建另一个视图:
def output(request):
    if request.is_ajax():
        py_obj = mycode.test_code(10)
        return render(request, 'yourapp/output.html', {'output': py_obj.a})

Your output.html can be like this:

<p>{{ output }}</p>

就是这样。没有标题,没有正文,什么也没有。这段代码将通过AJAX动态插入到index.html中。

现在让我们分析一下你的方法code

def code(self):
    return self.a, self.b

你知道这里会发生什么吗?函数只能返回一个值。你可能认为你正在返回整数a和b,但是错了!这个方法返回一个有两个元素的元组。该方法将返回(10, 4)

当你在index视图中调用此方法时,它只会返回这个元组,但你没有将其赋值给变量,所以它将被丢弃。这是无用的调用。

我希望这让你明白如何实现它。如果你不想使用JavaScript(和AJAX),你可以通过POST方式发送表单,并在视图中进行区分:

def index(request):
    if request.method == 'GET':
        return render(request, 'yourapp/index.html', {'output': ''})
    elif request.method == 'POST':
        py_obj = mycode.test_code(10)
        return render(request, 'yourapp/output.html', {'output': py_obj.a})

在这种情况下,您不需要视图输出和output.html。 您可以使用带有表单的index.html。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接