【问题标题】:Jquery Modal Confirmation on Django form submit for deletion of objectDjango表单上的Jquery Modal Confirmation提交删除对象
【发布时间】:2016-11-20 22:28:01
【问题描述】:

我正在使用带有 Crispy 表单的 Django,并且还在使用 Shopify Embedded Apps SDK。我正在尝试显示一个模式窗口,让用户确认他们要删除一个对象。

到目前为止,我的代码已附上。我的模态窗口出现了以下代码,但是,在用户在模态窗口上选择“删除”后,表单没有提交(并且对象没有被删除):

它只是关闭了模式,没有任何反应。

我尝试了网上的各种方法,但没有任何运气。

form.py

class MyForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)

        self.helper = FormHelper(self)

        self.helper.form_id = 'edit_form'

        self.helper.layout = Layout(        
            [... some input fields...]
        )

        # Add delete button
        self.helper.layout.append(Button('delete', 'delete'))

        # Normal submit button
        self.helper.layout.append(Submit('save', 'save'))

views.py

@login_required
def edit_object(request, *args, **kwargs):
    # Form handling logic
     with request.user.session:
         object = get_object_or_404(models.Object, pk=kwargs['object_id'], ...)

        if request.method == "POST":
            form = forms.MyForm(request.POST, request=request, instance=object)

            if not form.is_valid():
               [... do some stuff ...]

            if form.is_valid():

                # If the save button is pressed
                if request.POST.get('save'):
                    [... do some stuff to save and redirect to url of my choice ...]

                # If the delete button is pressed <<<< The Modal should appear prior to this
                if request.POST.get('delete'):
                    [... delete to object and redirect to url of my choice ... ]
        else:
            form = forms.MyForm(request=request, instance=supplier)

        return render(request, 'template.html', {'form': form})

template.html 使用 Shopify Embedded App SDK:

    <script type="text/javascript">
        [...]
        ShopifyApp.ready(function() {
            ShopifyApp.Bar.initialize({});

            $("#button-id-delete").click(function(ev){
                ShopifyApp.Modal.confirm({message: "Are you sure you want to delete?"}, function(result){
                    if(!result){
                        result.preventDefault();
                    }
                    else {
                        alert("Contine");
                        $("form#edit_form").submit();
                    }
                });
            });
        });
    </script>

<form enctype="multipart/form-data" method="post">
    {% crispy form %}
</form>

呈现的 html

<form enctype="multipart/form-data" method="post">
    <form  id="edit_form" method="post" > <input type='hidden' name='csrfmiddlewaretoken' value='.......' /> 
       [.... various input fields .....]
       <input type="button"
          name="delete"
          value="delete"
          class="btn destroy btn"
          id="button-id-delete"
          />
       <input type="submit"
          name="save"
          value="save"
          class="btn btn-primary"
          id="submit-id-save"
          />
    </form>
</form>

【问题讨论】:

  • 我认为删除input应该是type="submit"。目前,它是type="button",点击它不会做任何事情。
  • @xyres 我之前尝试过这个,并响应下面的菲利普,但没有得到想要的行为......

标签: javascript jquery python django shopify


【解决方案1】:

您的删除按钮 (&lt;input type="button" name="delete"...) 永远不会被发送。

调试此问题的快速方法是在您的视图中检查 django 中的 request.POST 变量。

在这里您以编程方式提交表单,因此永远不会收到“删除”。

                else {
                    alert("Contine");
                    $("form#edit_form").submit();
                }

我建议在提交之前通过 javascript 在表单中添加一个字段:

                else {
                    alert("Continue");
                    $('<input>').attr({
                        type: 'hidden',
                        name: 'delete'
                        value: 'delete'
                    }).appendto('#edit_form');
                    $("form#edit_form").submit();
                }

或者将您的delete 按钮设置为&lt;input type="submit"...,以便与表单一起发送。

【讨论】:

  • 我之前试过这个,但是当我做这个&lt;input type='submit'....时,表单会出现,但函数只会提交而不做preventDefault();(即模式弹出但它只是继续运行并删除对象与用户操作无关)。如果我这样做了,$("#button-id-delete").click(function(ev){ ev.preventDefault(); 那么模态将不会做任何事情......
  • (当我使用“向表单添加字段”方法添加字段时的行为是模式会出现,但按钮不会做任何事情。)
  • @cj1689262 我刚刚阅读了这些 cmets。回想起来,我有一个非常懒惰的答案。使用您的 type=button,您希望在单击时触发模式,如果结果为 false,则不需要 preventDefault。如果结果为真,添加隐藏字段并提交。
【解决方案2】:

我能够让它与这个 js 一起工作:

$("#submit-id-delete").click(function(ev){
    ev.preventDefault();

    var deleteBtn = $(this);

    ShopifyApp.Modal.confirm(
        {
            title: "Delete?",
            message: "Are you sure you want to delete this?",
            okButton: "Yes, delete",
            style: "danger"
        },
            function(result){

        if(!result){
            return false;
        }
        else {
            deleteBtn.parents('form').append('<input type="hidden" name="delete" id="delete" value="delete" />').submit();
            return true;
        }

    });
});

【讨论】:

    猜你喜欢
    • 2014-11-12
    • 2013-11-18
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多