【发布时间】:2020-02-17 14:02:21
【问题描述】:
我正在按照django-bootstrap-modal-forms 的说明进行操作,但我发现我的表单在提交表单时会发布或提交两次。首先,该对象只是被创建了两次,我可以从管理员那里看到。现在看来表单正在创建对象,但也进入了它的验证状态,如果表单成功,我显然不希望这样做。
有人经历过吗?我所做的只是我链接到的文档中概述的内容,我无法确定应该提交两次的任何原因。
这是我的代码:
home.html
<a href="#" class="create-shipment dropdown-itemcreatenew" onclick="closeNav()">Shipment</a>
<div class="modal fade" tabindex="-1" role="dialog" id="modal">
<div class="modal-dialog" role="document">
<div class="modal-content">
</div>
</div>
</div>
<script>
$(document).ready(function() {
$(".create-shipment").modalForm({
formURL: "{% url 'CreateShipmentView' %}"
});
});
</script>
views.py
class CreateShipmentView(BSModalCreateView):
template_name = 'create_shipment.html'
form_class = CreateShipmentForm
success_message = 'Success: Shipment Has Been Created!'
success_url = reverse_lazy('HomeView')
create_shipment.html(模态表单模板)
{% load crispy_forms_tags %}
<form method="post" action="">
{% csrf_token %}
<div class="modal-header">
<h5 class="modal-title">Create New Shipment</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
{{form|crispy}}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="submit-btn btn btn-primary">Create</button>
</div>
</form>
forms.py
class CreateShipmentForm(BSModalForm):
class Meta:
model = Shipment
fields = ['Reference_Number', 'Ultimate_Consignee']
urls.py
url(r'^create_shipment/', views.CreateShipmentView.as_view(), name='CreateShipmentView'),
提交按钮上的事件监听器
// Add click listener to the submitBtn
var ajaxSubmit = function (modalID, modalContent, modalForm, formURL, errorClass, submitBtn) {
$(submitBtn).on("click", function () {
// Check if form.is_valid() via ajax request when submitBtn is clicked
isFormValid(modalID, modalContent, modalForm, formURL, errorClass, submitBtn, submitForm);
});
};
// Check if form.is_valid() & either show errors or submit it
var isFormValid = function (modalID, modalContent, modalForm, formURL, errorClass, submitBtn, callback) {
$.ajax({
type: $(modalForm).attr("method"),
url: $(modalForm).attr("action"),
// Serialize form data
data: $(modalForm).serialize(),
success: function (response) {
if ($(response).find(errorClass).length > 0) {
// Form is not valid, update it with errors
$(modalID).find(modalContent).html(response);
$(modalForm).attr("action", formURL);
// Reinstantiate click listener on submitBtn
ajaxSubmit(modalID, modalContent, modalForm, formURL, errorClass, submitBtn);
} else {
// Form is valid, submit it
callback(modalForm);
}
}
});
};
【问题讨论】:
-
在渲染页面后检查源代码,看看是否有两个元素使用“create-shipment”类进行渲染,如果将 标签更改为
-
嗨@Foocli 我检查了你提到的内容 - 我没有看到使用该类呈现的两个元素,我还尝试将 更改为
-
@Foocli 如果它有帮助的话,我只是注意到我在 POST 后在终端中得到了这个:
[17/Feb/2020 20:18:43] "POST /create_customer/ HTTP/1.1" 200 3705 [2020-02-17 20:18:43,728] - Broken pipe from [localhost] -
破损的管道可能意味着很多。例如,正如 Ahmed 解释的 here。关于发帖的问题,太长了我就贴在回答区吧。
标签: html django bootstrap-modal