Django:如何从模板中调用视图函数?

36

我有一个问题,如何从模板HTML按钮调用视图函数?像onclick函数一样?以下是模板:

<input id="submit" type="button" onclick="xxx" method="post" value="Click" />

而 views.py 是:

def request_page(request):
    ...do something...
    return render_to_response("/directory.html", {})

非常感谢。

6个回答

114
Assuming that you want to get a value from the user input in an HTML textbox whenever the user clicks the 'Click' button, and then call a Python function (mypythonfunction) that you wrote inside mypythoncode.py. Note that the "btn" class is defined in a CSS file.
Inside templateHTML.html:
<form action="#" method="get">
 <input type="text" value="8" name="mytextbox" size="1"/>
 <input type="submit" class="btn" value="Click" name="mybtn">
</form>

在 view.py 内部:

import mypythoncode

def request_page(request):
  if(request.GET.get('mybtn')):
    mypythoncode.mypythonfunction( int(request.GET.get('mytextbox')) )
return render(request,'myApp/templateHTML.html')

2
这是一个非常好的答案 - 令人惊讶没有更多的投票...你在自己的项目中使用过吗? - nicorellius
1
我很高兴它有用。是的,我在Github上上传了一个项目,其中使用了它。https://github.com/MahshidZ/ArchivIT - Mahshid Zeinaly
1
请注意,GET和HEAD请求应该是安全/幂等的。https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html - Eloims
4
输入后的 {% csrf_token %} 是什么意思? - Danielius
我需要如何更改URL文件? - Uwe.Schneider
如 @Danielius 所提到的,我不得不在 <form> 标签内添加 {% csrf_token %}。此外,我使用了 <form method="POST" action=""> 并成功地调用了 request.POST.get("buttonname"),如果有人需要的话。我这样做是因为使用 GET 请求方法很令人困惑,然后还调用了 .get() 方法。 - Daggerpov

17

一种选择是,您可以使用 form 包装 submit 按钮。

像这样:

<form action="{% url path.to.request_page %}" method="POST">
    <input id="submit" type="button" value="Click" />
</form>

(删除 onclickmethod

如果您想在不重新加载页面的情况下加载页面的特定部分,可以这样做:

<input id="submit" type="button" value="Click" data_url/>

并在 submit 监听器上执行

$(function(){
     $('form').on('submit', function(e){
         e.preventDefault();
         $.ajax({
             url: $(this).attr('action'),
             method: $(this).attr('method'),
             success: function(data){ $('#target').html(data) }
         });
     });
});

3
是的,这就是Ajax提交正在做的事情。你的问题不太清楚,所以我添加了两个答案。 - karthikr
我想知道在Django中是否有进行多线程的方法?这是问题链接:https://dev59.com/AWMm5IYBdhLWcg3wdeya - Robert
Django-Notification 可能是你正在寻找的东西。这与这个问题有什么关系呢? - karthikr
@karthikr,你需要将第一个片段中的输入更改为type="submit"。 - Kelsey
我应该把提交监听器的代码放在哪里? - Uwe.Schneider

12

这个怎么样:

<a class="btn btn-primary" href="{% url 'url-name'%}">Button-Text</a>

这个类包含了Bootstrap主按钮的样式。


5
你可以像这样将输入放在一个表单中:-
<script>
    $(document).ready(function(){
        $(document).on('click','#send', function(){
            $('#hid').val(data)
            document.forms["myForm"].submit();
        })
    })
</script>

<form id="myForm" action="/request_page url/" method="post">
    <input type="hidden" id="hid" name="hid"/>
</form>
<div id="send">Send Data</div>

5
删除所有数据的操作:

HTML文件

  class="btn btn-primary" href="{% url 'delete_product'%}">Delete

将上述代码放在锚点标签(a标签)中。 url.py
path('delete_product', views.delete_product, name='delete_product')]

views.py

def delete_product(request):
    if request.method == "GET":
        dest = Racket.objects.all()
        dest.delete()
        return render(request, "admin_page.html")

4
例如,注销按钮可以这样编写:

<button class="btn btn-primary" onclick="location.href={% url 'logout'%}">Logout</button>

退出登录的端点在哪里:

#urls.py:
url(r'^logout/$', auth_views.logout, {'next_page': '/'}, name='logout'),

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