【发布时间】:2026-01-18 20:40:01
【问题描述】:
我有一个表单,我正在尝试通过 AJAX 和 jQuery 将数据提交到 Django API。通过 Django 管理员提交工作正常,但通过表单,textarea 字段是导致问题的一个原因。我有一个没有 textarea 的类似表格,它工作正常。 textarea 内容未提交,我不知道为什么。这是表格:
<form id="addMaintenanceRecordsForm" action="">
{% csrf_token %}
<div class="mb-3">
<div class="row">
<div class="col-md-12">
<label>Title <span style="color: #dd0000;">*</span></label>
<input type="text" class="form-control" name="maintenance_title" placeholder="Enter Title" id="mr-title" required>
</div>
</div>
</div>
<div class="mb-3">
<div class="row">
<div class="col-md-12">
<label>Details <span style="color: #dd0000;">*</span></label>
<textarea class="form-control" id="mr-summary" name="summary" placeholder="Describe the nature of maintenance repair..." rows="3" required></textarea>
</div>
</div>
</div>
<div class="mb-3">
<div class="row">
<div class="col-md-12">
<label>Repair Status <span style="color: #dd0000;">*</span></label>
<select class="form-select" name="repair_status" id="mr-status" aria-label="Default select example" placeholder="Repair Status" required>
<option selected disabled>Choose...</option>
<option value="Complete">Complete</option>
<option value="Ongoing">Ongoing</option>
</select>
</div>
</div>
</div>
<button type="submit" class="btn btn-soft-primary btn-sm" id="mr-create">Create New Record</button>
<button type="button" class="btn btn-soft-secondary btn-sm">Cancel</button>
</form>
这是我的 jQuery 代码
$(function() {
$('#addMaintenanceRecordsForm').on('submit', function(e) {
e.preventDefault();
console.log($("#addMaintenanceRecordsForm").serializeArray());
let url = "http://127.0.0.1:8000/api/maintenance/add/";
$.ajax({
type : 'POST',
url : url,
data : $("#addMaintenanceRecordsForm").serializeArray(),
dataType: "json",
success: function(data){
alert("New Maintenance Records Added!");
location.reload();
},
error:function(data){
alert("Maintenance Records Not Added!");
location.reload();
}
});
});
});
我不断收到此错误:
Bad Request: /api/maintenance/add/
POST http://127.0.0.1:8000/api/maintenance/add/ 400 (Bad Request)
在控制台上我得到了这个:
{
"name": "csrfmiddlewaretoken",
"value": "jZ7Y2WrJB67xrkP34U53ngf11cu4ju1nvzlQ29Krtqv5ehkjuami0uwvyCrFdXAs"
}
{
"name": "maintenance_title",
"value": "Pipe Leakages"
}
{
"name": "summary",
"value": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
}
{
"name": "repair_status",
"value": "Ongoing"
}
而 django CMD 我得到了这样的字典
<QueryDict: {'csrfmiddlewaretoken': ['LmbrIAnh7fJcAjjQ0hnEiwSujdFTJfLgXWpjINGZZz7KngO6qxETVK9YQDCuDIkl'], 'maintenance_title': ['Pipe Leakages'], 'summary': ['Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'], 'repair_status': ['Ongoing']}>
我尝试过其他解决方案,例如:
data : $("#addMaintenanceRecordsForm").serialize(),
或
data : $("#addMaintenanceRecordsForm input, #addMaintenanceRecordsForm textarea").serializeArray(),
或
data : $("#addMaintenanceRecordsForm").find('input', 'select').serializeArray(),
或
$('#mr-create').on('click', function(e) {
e.preventDefault();
但它们似乎都不起作用。 textarea 没有序列化可能是什么问题?
【问题讨论】:
-
您说它返回 400 Bad Request,您是否打开了调试模式?如果是这样,您可以使用 Postman 访问相同的 API 并查看它返回的内容吗? Django 调试模式应该有助于返回更多信息。
-
@MarkBarrett 调试模式已开启。我按照你的建议做了,邮递员返回
"maintenance_title":["This field is required."],"summary":["This field is required."],"repair_status":["This field is required."]},然后是Bad Request: /api/maintenance/add/ [20/Oct/2021 18:13:55] "POST /api/maintenance/add/ HTTP/1.1" 400 301,我不确定这是否是你要求的信息。我已经通过邮递员输入了新的原始数据并且它有效。所以在我看来端点工作得很好。甚至http://127.0.0.1:8000/api/maintenance/add/也可以。 -
你在使用 Django REST 吗?
-
@MarkBarrett 是的,我是。我从做一个简单的实验。我将
标签: jquery django ajax api textarea