Javascript 如何将jQuery单击事件添加到Django管理员保存并继续按钮?

Javascript 如何将jQuery单击事件添加到Django管理员保存并继续按钮?,javascript,jquery,django,forms,Javascript,Jquery,Django,Forms,我试图在django管理表单中添加一些复杂的javascript验证。当用户单击三种类型的保存按钮(保存,保存并继续,或保存并添加另一个)时,我的javascript将运行。它所做的部分工作是在发布之前调用ajax以提供特殊检查。当我使用jquery的添加并继续按钮捕获点击事件时,有时我会停止提交表单,有时我会允许提交表单。有时,只抛出警告,而不是错误,然后用户可以决定继续提交表单 当最终提交时,需要使用他们最初单击的按钮指定的流程提交。我发现添加form.submit()的JS仅根据保存按钮提

我试图在django管理表单中添加一些复杂的javascript验证。当用户单击三种类型的保存按钮(保存保存并继续,或保存并添加另一个)时,我的javascript将运行。它所做的部分工作是在发布之前调用ajax以提供特殊检查。当我使用jquery的添加并继续按钮捕获点击事件时,有时我会停止提交表单,有时我会允许提交表单。有时,只抛出警告,而不是错误,然后用户可以决定继续提交表单

当最终提交时,需要使用他们最初单击的按钮指定的流程提交。我发现添加
form.submit()的JS仅根据保存按钮提交,将用户带回型号列表,即使用户最初单击了保存并继续按钮

我从
form.submit()更改了我的JS
捕获按钮本身,并在用户选择忽略警告时触发绕过验证的单击。但即使单击的按钮是“保存并继续”,保存后仍会返回模型列表

当用户按下按钮时,Django管理员在客户端执行什么操作来指定一个保存并继续,而不是一个普通的保存

这是我的问题的简短总结版

如何使用Javascript(包括jQuery)强制提交Django管理表单,该表单将:

  • 保存并继续
  • 保存并添加另一个

提前感谢您的帮助。

我已经解决了这个问题。我必须创建一个隐藏字段,其中包含已单击按钮的名称和已单击按钮的值,并将该字段与表单一起提交。工作得很好


编辑(从2020年2月起)

所以我最初在几年前发布了这个Q&A,在过去的几个月里没有与Django合作,但我发现有人想要我的代码。从内存和我手头的一些代码开始工作,它是这样的(未经测试)

var-frm=$('form');
var chosenBtn=frm.find('[name=“_save”]');
var btns=frm.find('[name=“\u save”],[name=“\u addother”],[name=“\u continue”]”);
btns.unbind('click.btnAssign')。bind('click.btnAssign',函数(e)
{
chosenBtn=$(本);
});
frm.unbind('submit.saveStuff').bind('submit.saveStuff',函数(e)
{
//在此处添加您自己的验证。如果验证失败,您可以调用:
//e.预防违约();
//但如果它能工作,就不需要那条线。如果一切正常。。。
附加(
[
''
].加入(“”);
});

请分享您的演示。
var frm = $('form');
var chosenBtn = frm.find('[name="_save"]');
var btns = frm.find('[name="_save"], [name="_addanother"], [name="_continue"]');
btns.unbind('click.btnAssign').bind('click.btnAssign', function(e)
{
    chosenBtn = $(this);
});
frm.unbind('submit.saveStuff').bind('submit.saveStuff', function(e)
{
    // Add your own validation here. If the validation fails, you can call:
    // e.preventDefault();
    // But if it works, no need for that line. If everything works...

    frm.append(
    [
        '<input type="hidden" name="',
        chosenBtn.attr('name'),
        '" value="',
        chosenBtn.attr('value'), // or maybe chosenBtn.text()
        '" />'
    ].join(''));
});