【问题标题】:How do I call a Django function on button click?如何在单击按钮时调用 Django 函数?
【发布时间】:2013-02-26 18:56:01
【问题描述】:

我正在尝试编写一个 Django 应用程序,但我不知道如何在单击按钮时调用视图函数。

在我的模板中,我有一个链接按钮,如下所示,点击后会转到另一个网页:

<a target="_blank" href="{{ column_3_item.link_for_item }}">Check It Out</a>

单击按钮时,我还想调用 Django 视图函数(以及重定向到目标网站)。视图函数增加数据库中存储按钮被点击次数的值。

column_3_item.link_for_item 是指向外部网站的链接(例如 www.google.com)。现在,当单击该按钮时,它会打开一个新窗口,将您带到谷歌网站。

我想做的是在单击按钮时调用 Django 视图函数,该按钮更新数据库而不刷新页面。我怎样才能做到这一点?

【问题讨论】:

  • 我不明白你的问题。您的代码在您的 urlconf 中映射到 column_3_item.link_for_item 的任何位置调用视图函数。
  • 补充丹尼尔的评论:如果你需要点击->“实时”更新计算机,不刷新页面,你可能需要重写你的问题。如果您有指向该链接的视图,则您已经拥有所需的内容
  • 抱歉给您带来了困惑。 column_3_item.link_for_item 是指向外部网站的链接(例如:- www.google.com)。现在,当单击该按钮时,它会打开一个新窗口,该窗口将转到谷歌网站。我想做的是在单击按钮时调用 django 视图函数,该按钮更新数据库而不刷新页面。
  • 您可以通过多种方式做到这一点,但如果您不想重新加载/更改页面,我认为您必须依赖 javascript(例如,对更新计数器的视图进行 ajax 调用)用于打开新页面的相同 标记)。使用 javascript 有问题吗?

标签: python django django-templates django-views


【解决方案1】:

这是一种纯 JavaScript 的简约方法。我使用 JQuery,但您可以使用任何库 (or even no libraries at all)。

<html>
    <head>
        <title>An example</title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
        <script>
            function call_counter(url, pk) {
                window.open(url);
                $.get('YOUR_VIEW_HERE/'+pk+'/', function (data) {
                    alert("counter updated!");
                });
            }
        </script>
    </head>
    <body>
        <button onclick="call_counter('http://www.google.com', 12345);">
            I update object 12345
        </button>
        <button onclick="call_counter('http://www.yahoo.com', 999);">
            I update object 999
        </button>
    </body>
</html>

替代方法

您可以通过以下方式更改链接,而不是放置 JavaScript 代码:

<a target="_blank" 
    class="btn btn-info pull-right" 
    href="{% url YOUR_VIEW column_3_item.pk %}/?next={{column_3_item.link_for_item|urlencode:''}}">
    Check It Out
</a>

在你的views.py:

def YOUR_VIEW_DEF(request, pk):
    YOUR_OBJECT.objects.filter(pk=pk).update(views=F('views')+1)
    return HttpResponseRedirect(request.GET.get('next'))

【讨论】:

  • 如果投反对票,请在评论中解释原因,以便我改进答案
  • 非常感谢。我使用了另一种方法,它按预期完美运行。
  • 使用 Django 的目的是避免使用其他语言。我对 js 感到抱歉,但是如果您在单击按钮时使用 Django,我们希望使用 Django 而不是 js 来触发。请帮帮我!
  • @KuneMohith 然后请遵循替代方法,它不需要 javascript。除此之外,我不认为 Django 的目的是消除使用其他语言。您不能在客户端运行“django”(python)。
  • HttpResponseRedirect(request.GET.get('next'))) 最后包含一个 ')'。
【解决方案2】:

我个人使用了两种可能的解决方案

1.不使用表格

 <button type="submit" value={{excel_path}} onclick="location.href='{% url 'downloadexcel' %}'" name='mybtn2'>Download Excel file</button>

2.使用表单

<form action="{% url 'downloadexcel' %}" method="post">
{% csrf_token %}


 <button type="submit" name='mybtn2' value={{excel_path}}>Download results in Excel</button>
 </form>

urls.py 应该有这个

path('excel/',views1.downloadexcel,name="downloadexcel"),

【讨论】:

    【解决方案3】:

    以下答案可能对您问题的第一部分有所帮助:

    Django: How can I call a view function from template?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-29
      • 2016-12-08
      • 2020-12-23
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      相关资源
      最近更新 更多