在Django中执行Python脚本,并通过前端参数



我想使用django webapp操纵与外部mongodb数据库条目关联的值。

我已经创建了该应用程序,目前我正在简单表中显示所有条目及其关联的值。

我的想法只是创建一个按钮,该按钮调用一个带有参数(该条目的ID)的python脚本,然后将其从false更改为true。问题是,这看起来像是火箭科学,我已经过去了几天了,我无法使它起作用,因为我在Ajax或Jquery方面几乎没有熟练的能力,所有相关的例子我可以发现,尽管它的出现如何,但似乎与我的处境相关,但与Django 2.0 相吻合。

我正在使用django 2.1.5

def change_value(idnumber):
    db_value = get_db_status_value(idnumber)
    if db_value is True:
        change_db_entry_status(idnumber, False)
    else:
        change_db_entry_status(idnumber, True)

my_template.html

<table>
    <thead>
        <tr>
            <th> Status </th>
            <th> Button </th>
        </tr>
    </thead>
    <tbody>
    { % for entry in entry_data % }
    <tr>    
        <td> {{ entry.status }} </td>
        <td> <button type="button">{{ entry.idnumber }}</button> </td>
    </tr>
    </tbody>
    {% endfor %}
</table>    

我根本无法弄清楚如何在其中获得change_value函数,我可以为此创建一个按钮并包括一个参数(entry.idnumber)。这似乎是非常困难的,据我了解,这是一个设计原则,但是如果我什至无法完成像上面的基本工作,那似乎是可惜的。

我希望有人可以解释我应该如何解决这个问题?到目前为止,似乎我需要Ajax或jQuery(不幸的是,我几乎不知道这一点的基础,通常会让我想起的是,在项目和应用程序级别中存在的urls.py似乎在Django 2.0中起作用有些不同。 与较旧版本相比)

这实际上并不困难。只是您错过了对客户与后端代码之间关系的理解。

渲染模板后,用户将其视为浏览器中的HTML。就后端(即Django)而言,就是这样。在服务器上运行任何进一步代码的是发送另一个请求。请求涉及与服务器联系的浏览器,该浏览器需要URL和DJANGO中的视图。

现在,发送该请求的一种方法是通过Ajax,但出于您的目的,这不是必要的;由于您只是在学习,因此如果您使其成为简单的形式,那就更容易了。因此,您的模板可能看起来像这样:

{% for entry in entry_data % }
<tr>    
    <td> {{ entry.status }} </td>
    <td><form action="{% url 'change_value' idnumber=entry.idnumber %}" method="POST"> {% csrf_token %} <button type="submit">{{ entry.idnumber }}</button> </form></td>
</tr>
{% endfor %}
</tbody>

请注意,for循环的每个迭代如何具有单独的表单,该表格将其发布到特定URL,包括ID号。

接下来您需要一个网址:

path('change_value/<int:idnumber>/', views.change_value, name='change_value'),

并将您的功能更新为实际是一个视图,该视图需要接受请求并返回响应:

def change_value(request, idnumber):
    if request.method != "POST":
        return HttpResponseNotAllowed()
    db_value = get_db_status_value(idnumber)
    if db_value:
        change_db_entry_status(idnumber, False)
    else:
        change_db_entry_status(idnumber, True)
    return redirect('/') 

您始终需要在发布后重定向,但是您可以首先将其重定向回到渲染my_template的同一URL。(还请注意,我已经进行了测试以确保用户实际发送帖子;您不希望Google抓取此URL并为您翻转您的值。)

就是这样,现在您有一个应切换值的按钮。

@daniel的答案足以适合您。但是,如果您想使用ajax,以便页面不必刷新来更改vaue,则可以执行以下操作:

在模板中进行更改为:

<table>
<thead>
    <tr>
        <th> Status </th>
        <th> Button </th>
    </tr>
</thead>
<tbody>
{ % for entry in entry_data % }
<tr>    
    <td id="status"> {{ entry.status }} </td>
    <td> <button type="button" onclick="change_status(this)" id="{{ entry.idnumber }}">{{ entry.idnumber }}</button> </td>
</tr>
</tbody>
{% endfor %}

和一个脚本为:

<script>
function change_status($this){
var request_data = $this.id;
console.log("data: " + request_data);
$.post({
    url: "url that leads to your view",
    data : { request_data: request_data},
    success : function(json) {
        document.getElementById('status').innerHTML = "" //insert the data returned from the function 
    }
})}
</script>

最新更新