【问题标题】:Django request.GET does not contain name of submitted form buttonDjango request.GET 不包含提交表单按钮的名称
【发布时间】:2015-03-07 03:14:16
【问题描述】:

我基本上在上一个问题 (Django request.POST does not contain the name of the button that submitted the form) 中解决了同样的问题,但那里描述的修复不起作用。

我正在使用 ajax,因此在提交后,我会停留在同一页面上。我的页面有两种形式。第一个表单有三个按钮,我在 GET 请求中正确传递了按钮的“名称”。我的第二个表单有两个按钮,但我无法在 GET 请求中传递任一按钮的“名称”(但是,输入字段的“名称”在 GET 请求中)。我不知道为什么它不起作用。有任何想法吗?

JS 解决方案:

$(document).ready(function(){
    console.log("hello from email.js");
    $('.email_citations').submit(function(event){
        console.log("submit email");
        var whichButton = $(".form_button[clicked=true]")[0].value
        console.log("WHICH BUTTON: ");
        console.log(whichButton);
        var email_address = $(this).val();
        var data = $(this).serialize();
        data += "&" + whichButton;
        console.log(data);
        $.ajax({
            data: data,
            type: $(this).attr('method'),
            url: $(this).attr('action'),
            success: function(data){
                console.log("DATA: ");
                console.log(data);
                $('.email_sent_message').html(JSON.parse(data).submit_message);
            }
        });
        return false;
    });
    $(".form_button").click(function() {
        $(".form_button").removeAttr("clicked");
        $(this).attr("clicked", "true");
    });
});

html 表单:

<!-- This form works! -->
<form action="export_options" method="get">
    <button type="submit" name="plain" class="button inline large hover" id="exportButton2">Download Plain Text</button>
    <button type="submit" name="ris" class="button inline large hover" id="exportButton1">Download RIS File</button>
    <button type="submit" name="bibtex" class="button inline large hover" id="exportButton3">Download BibTeX File</button>
  </form>

<form class="email_citations" id="EmailCitationsForm" action="email_it" method="get">
    <input class="input-text" type="text" size="75" maxlength="75" style="width: 40%; font-size: 16px; margin-right: 5px; height: 50px" name="email_address" placeholder="email address">
    <button type="submit" value="selected" name="which_citations" class="form_button button inline large hover" id="exportButton4" >Send My Selected Citations</button>
    <button type="submit" value="all" name="which_citations" class="form_button button inline large hover" id="exportButton5">Send All Citations</button>
</form>
<div class="email_sent_message" style="float: left; color: #9e1d2a; font-size: 20px; font-weight: bold">{{ submit_message }}</div>

我在 email.js 文件中的 javascript/ajax:

$(document).ready(function(){
    console.log("hello from email.js");
    $('.email_citations').submit(function(event){
        console.log("submit email");
        var clicked_button = $(".form_button[clicked=true]")[0].name;
        console.log(clicked_button);
        clicked_button.push($(".form_button[clicked=true]")[0].value);
        console.log(clicked_button);
        var email_address = $(this).val();
        var data = $(this).serialize();
        data += "&" + clicked_button;
        console.log(data);
        $.ajax({
            data: $(this).serialize(),
            type: $(this).attr('method'),
            url: $(this).attr('action'),
            success: function(data){
                $('.email_sent_message').html(JSON.parse(data).submit_message);
            }
        });
        return false;
    });
    $(".form_button").click(function() {
        $(".form_button").removeAttr("clicked");
        $(this).attr("clicked", "true");
    });
});`

我的看法:

def email_it(request):
    context = RequestContext(request)
    if request.method == 'GET':
        getdict = request.GET.dict()
        form = EmailCitationsForm(request.GET)
        if form.is_valid():
            context = request.session.get('All_Citations_Context')
            if ('which_citations') in getdict.keys():
                if 'all' in getdict.values():
                    text_template = 'email_allCitations.txt'
                    html_template = 'email_allCitations.html'

                    text_content = render_to_string(text_template, context, context_instance=RequestContext(request))
                    html_content = render_to_string(html_template, context, context_instance=RequestContext(request))

                    msg = EmailMultiAlternatives(subject, text_content, from_email, to)
                    #msg.attach()
                    msg.attach_alternative(html_content, "text/html")
                    msg.send()
                    submit_message = "Thank you. Your citations have been sent via email."

                    return http.HttpResponse(json.dumps({'submit_message': submit_message}))

                if 'selected' in getdict.values():
                   text_template = 'email_selectedCitations.txt'
                   html_template = 'email_selectedCitations.html'

                    text_content = render_to_string(text_template, context, context_instance=RequestContext(request))
                    html_content = render_to_string(html_template, context, context_instance=RequestContext(request))

                    msg = EmailMultiAlternatives(subject, text_content, from_email, to)

                    msg.attach_alternative(html_content, "text/html")
                    msg.send()
                    submit_message = "Your citations have been sent via email."

                    return http.HttpResponse(json.dumps({'submit_message': submit_message}))
            else:
                submit_message = "Something went wrong. Sorry, your email did not send."

        else:
            submit_message = form.errors['email_address']
    else:
        form = EmailCitationsForm()
        submit_message = ""
    return http.HttpResponse(json.dumps({'submit_message': submit_message}))

【问题讨论】:

  • 我刚刚将 ajax 代码添加到我的问题中......
  • 你认为你的 js 中的$(this)是谁?
  • 我很确定你得到了什么...$(this) 包含我请求中的数据,但我的问题是按钮数据(按钮的“名称”信息) 不在里面。其他表单信息(csrftoken 和 email_address)在那里,但按钮数据不...?
  • 这就是我所说的:在回调内部,this 指的是 Ajax 调用的 jqXHR 对象,而不是事件处理程序绑定到的元素。尝试在您的 JS 中打印按钮名称
  • 谢谢你,米海。我刚刚开始使用 JS 和 Ajax,所以我不知道这意味着什么,但我会读到 is- 至少我现在有了一个方向!

标签: html django forms get request


【解决方案1】:

好吧,这更像是一个 HTML/jQuery 问题而不是 Django 问题。

首先,您的第一个表单有效,因为大概是您让浏览器处理提交。如果您使用与提供的代码类似的代码,则它不起作用。

如果你记录 $(this).serialize() 你会得到你在后端得到的东西。看看这个答案jQuery: how to get which button was clicked upon form submission?

<form class="email_citations" id="EmailCitationsForm" action="email_it" method="get">

    <input class="input-text" type="text" size="75" maxlength="75" style="width: 40%; font-size: 16px; margin-right: 5px; height: 50px" name="email_address" placeholder="email address">
    <button type="submit" value="selected_citations" name="selected_citations" class="form_button button inline large hover" id="exportButton4" >Send My Selected Citations</button>
    <button type="submit" value="all_citations" name="all_citations" class="form_buttonbutton inline large hover" id="exportButton5">Send All Citations</button>

</form>

请注意,我已删除 django 位。

$(document).ready(function(){
    console.log("hello from email.js");
    $('.email_citations').submit(function(event){
        console.log("submit email");
        var clicked_button = $(".form_button[clicked=true]")[0].name;
        console.log(clicked_button);
        var email_address = $(this).val();
        var data = $(this).serialize();
        data += "&" + clicked_button;
        console.log(data);
        $.ajax({
            data: $(this).serialize(),
            type: $(this).attr('method'),
            url: $(this).attr('action'),
            success: function(data){
                $('.email_sent_message').html(JSON.parse(data).submit_message);
            }
        });
        return false;
    });
    $(".form_button").click(function() {
        $(".form_button").removeAttr("clicked");
        $(this).attr("clicked", "true");
    });
});

或查看 plunker http://plnkr.co/edit/CxPGmxQfeHhtsWiANDJ1

【讨论】:

  • 非常感谢 elpaquete!不过,我仍然在将数据传递给我的视图函数时遇到问题。按钮信息不在我的要求中。在我看来,当我打印 request.GET 时,我只有:。但是,我在 JS 中添加了 clicked_button.push($(".form_button[clicked=true]")[0].value);,并且我的 request.GET 现在包含 但我无法在该查询字典中找到“selected_citations”。但是,如果单击了“all_citations”,我可以找到它..?
  • 我找到了一个解决方法:我给两个按钮赋予了相同的名称但不同的值。在我看来,我搜索字典值(“all_citations”或“selected_citations”)。这行得通-单击该按钮时我可以找到“all_citations”,单击该按钮时可以找到“selected_citations”。我不知道为什么我原来的方式不起作用,但这确实有效!谢谢!
  • 很抱歉再次打扰,但最后一件事......电子邮件现在可以正确发送,但我的“submit_message”没有出现在同一页面上。当我提交表单时,我被发送到一个仅包含 {"submit_message": "Thank you for using AppCiter. Your citations has been sent through email."} 的新页面,而不是让提交消息出现在同一页面上。这是以前的工作,我不知道如何再次修复它......? @elpaquete
  • 我也没有。您是否将 HttpResponseRedirect 返回到浏览器?
  • 这个问题是 clicked_button.push($(".form_button[clicked=true]")[0].value); 导致错误,因此 Ajax 函数从未被执行!我不得不改变周围的一切——修复又回到了我的问题中。感谢您的帮助!
猜你喜欢
  • 2011-01-10
  • 1970-01-01
  • 2012-01-24
  • 2015-05-07
  • 2014-10-31
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多