在Django中,如何知道按下了哪个按钮?

时间:2020-03-03 21:51:11

标签: python html django

这是我的html,我有两个按钮,一个用于接受,另一个用于拒绝请求。在我看来,我需要知道按下了哪个按钮以及申请人的电子邮件(tutor_application.tutor.chalkslateuser.email)。我尝试了许多解决方案,但无济于事。


{% for tutor_application in tutor_application_list %}

    <div class="card" style="width: 15rem;">
      <img src="{{ tutor_application.tutor.picture.url }}" class="card-img-top" >
      <div class="card-body">
        <h5 class="card-title">
            {{ tutor_application.tutor.chalkslate_user.first_name }} {{ tutor_application.tutor.chalkslate_user.last_name }}
        </h5>
        <h6 class="card-subtitle mb-2 text-muted">{{ tutor_application.note }}</h6>
        <h6 class="card-subtitle mb-2 text-muted">{{ tutor_application.posted }}</h6>
      </div>
      <a class="btn btn-outline-success" role="button" type="submit"> Accept </a>
      <a class="btn btn-outline-danger" href="#" role="button"> Reject </a>
    </div>

{% endfor %}

2 个答案:

答案 0 :(得分:0)

请使用Django Forms框架!绝对可以。

但是,没有理由不为一个Django表单/页面设置两个提交按钮。它们具有名称和值。例如

<input type="submit name="update" value="Update" 
     class="btn btn-primary" id="submit-id-update" />

<input type="submit" name="done" value="Done" 
     class="btn btn-primary" id="submit-id-done" />

在您看来,您可以在request.POST中查看被按下的位置。例如,

if request.POST.get('done', None):
     # user pressed the Done button

答案 1 :(得分:0)

信息

让我们分层,避免出现类似的混乱情况。有两层,客户端服务器端

服务器端

Django在服务器端工作,他使用所有其他东西从发送到页面的变量中获取数据,因此通常他会装入一个HTML页面,并将其返回给您的客户端(在这种情况下,您)

客户端

这是django(或任何其他服务器或框架)返回的页面,该页面在客户端浏览器中运行,而不是在服务器中运行,称为DOM,而django无法对其进行操作,因为它已经被渲染,您需要做使用 JavaScript ,以便您可以与页面中的元素进行交互,触发事件并查看客户端是否有任何数据更改,在客户端使用Javascript的一种简单方法是使用Jquery,因为它是一个库友好

这是您的代码,稍有变化,我在两个链接中都添加了名称和ID,它们的名称分别为btnAccept和btnReject,并添加了<input type="hidden" id="btnType" name="btnType">

{% for tutor_application in tutor_application_list %}

    <div class="card" style="width: 15rem;">
      <img src="{{ tutor_application.tutor.picture.url }}" class="card-img-top" >
      <div class="card-body">
        <h5 class="card-title">
            {{ tutor_application.tutor.chalkslate_user.first_name }} {{ tutor_application.tutor.chalkslate_user.last_name }}
        </h5>
        <h6 class="card-subtitle mb-2 text-muted">{{ tutor_application.note }}</h6>
        <h6 class="card-subtitle mb-2 text-muted">{{ tutor_application.posted }}</h6>
      </div>
      <input type="hidden" name="btnType">
      <a id="btnAccept" name="btnAccept" class="btn btn-outline-success" role="button" type="submit"> Accept </a>
      <a id=="btnReject" name="btnReject" class="btn btn-outline-danger" href="#" role="button"> Reject </a>
    </div>

{% endfor %}

如果您想在客户端执行此操作,请在Jquery中使用一些代码在前面进行操作

window.addEventListener("DOMContentLoaded", function(){
    $("#btnAccept").click(function(){
        $("#btnType").val('accepted');
    });

    $("#btnReject").click(function(){
        $("#btnType").val('rejected');
    });
});

因此,在您的帖子数据中,只需检查btnType中的值并查看是否接受或拒绝

或者只是在您的输入中添加标签名称(就像我之前所做的那样),您就可以从请求数据中获取它...您应该将标签更改为,并在单击它时在后端将其获取

编辑

您表单中的所有数据都将位于request.POST(如果您以POST的形式发送),因此您可以将其作为request.POST['email'],这很脏,因为如果您没有在POST中使用电子邮件会引发错误),或者是一种更好的方法,即request.POST.get('email', None),那就尝试获取名为email的属性,如果找不到,只会返回None(空),因此您可以对其进行验证与如果或类似的东西

关于对象tutor_application,当您使用tutor_application.tutor.chalkslateuser.email呈现模板时,该模板将只是电子邮件作为字符串,因此在将其发送到前端时,不会保留对象的引用,因此,如果您想知道选择了什么家教,则可能必须在HTML中输入ID或电子邮件作为输入,以便将其发送回后端并弄清楚什么是家教

<input type="hidden" name="email" value="{{tutor_application.tutor.chalkslateuser.email}}">

在后端,您将其获得为

email = request.POST.get('email', None')

请紧记将<a>标记更改为<input name="">,以便您可以在后端将其作为 request.POST

中的属性