javascript - (仍然未回答)django 复选框在数据库中保存是或否
问题描述
<form id="form" name="form">
<input type="checkbox" value="1" name="Asthma" data-form-field="Option" class="form-check-input display-7" id="checkbox1" title="Check if Student have Asthma">
<input type="checkbox" value="1" name="Congenital" data-form-field="Option" class="form-check-input display-7" id="checkbox1" title="Check if Student have Congenital Anomalies">
<input type="checkbox" value="1" name="Contact" data-form-field="Option" class="form-check-input display-7" id="checkbox1" title="Check if Student use Contact lens">
</form>
我的 html 中有这段代码
<script type="text/javascript">
// when page is ready
$(document).ready(function() {
// on form submit
$("#form").on('submit', function() {
// to each unchecked checkbox
$(this + 'input[type=checkbox]:not(:checked)').each(function () {
// set value 0 and check it
$(this).attr('checked', true).val(0);
});
})
})
</script>
我的问题是每次我将结果保存到我的数据库中时,结果总是自动是,即使我未选中 html 中的复选框(否)。我不知道我的 javascript 是否正确
这是我的意见.py
Asthma = request.POST['Asthma']
Congenital = request.POST['Congenital']
Contact = request.POST['Contact']
V_insert_data = StudentUserMedicalRecord(
Asthma=Asthma,
CongenitalAnomalies=Congenital,
ContactLenses=Contact
)
V_insert_data.save()
模型.py
Asthma=models.BooleanField(null=True, blank=True, default=False)
CongenitalAnomalies=models.BooleanField(null=True,blank=True, default=False)
ContactLenses=models.BooleanField(null=True,blank=True, default=False)
即使我从我的 html 插入记录也未选中(否),结果总是在我的数据库中自动“是”,你能修复我的 javascript 代码吗?似乎它不起作用。
解决方案
引用自此来源的文本:https ://docs.joomla.org/Talk:Checkbox_form_field_type
同样的问题不仅适用于 Joomla 项目,也适用于其他使用复选框的 Web 应用程序或网站(特别注意粗体部分)。
保存表单中未选中的复选框时需要特别小心!对于认为 Joomla 负责这一点的组件开发人员来说,这是一个常见的错误。Joomla 没有,直到现在。(Joomla 2.5 中的问题仍然存在。)
您会看到,在保存带有未选中复选框的表单时,POST 数据中没有变量!因此,该值不会在您的数据库中被覆盖是很常见的,特别是如果它已经在表单上代表“已检查”的值(例如 1 )上。
这就是您问题中的 JavaScript 片段的用途。
// when page is ready
$(document).ready(function() {
// on form submit
$("#form").on('submit', function() {
// to each unchecked checkbox
$('input[type=checkbox]:not(:checked)').each(function() {
// set value 0 and check it
$(this).attr('checked', true).val(0);
})
})
})
我删除了这$(this +
部分,因为这会破坏事情。
澄清一下:脚本检查未选中的复选框(以确保有一个复选框被发布)。但同时它在checked
状态时将值更改为 0 (!)
因此,如果您有未选中的框,它们将代表 0,而不是被排除在 POST 请求数据之外。并且当您自己检查项目时,它会不理会它们,它将在复选框的 POST 数据中表示为值 1。
重复的 ID 也是您需要防止的。它不是有效的 HTML5。
你也有这个代码:
request.POST['Asthma']
我检查并发现它返回一个QueryDict
. 在此页面上发现:
https ://docs.djangoproject.com/en/2.2/ref/request-response/#django.http.QueryDict
该页面的示例:
QueryDict('a=1&a=2&c=3')
返回:<QueryDict: {'a': ['1', '2'], 'c': ['3']}>
这意味着 egrequest.POST['Asthma']
将始终返回一个列表,该列表可能被强制转换为布尔类型。因此,无论列表中的内容是什么,它都可能True
始终转换为。
所以当你读到它时说:
QueryDict.__getitem__(key)¶
返回给定键的值。如果键有多个值,则返回最后一个值。
所以在这里更好地使用__getitem__(key)
或其别名:
QueryDict.get(key, default=None)¶
使用与getitem ()相同的逻辑, 如果键不存在,则使用挂钩返回默认值。
当然,使用 JavaScript 片段是您可以使用的一种方法。但是如果你喜欢在你的 Python 代码中处理这个,你可以QueryDict
像这样使用:
Asthma = request.POST.get('Asthma', '0')
推荐阅读
- javascript - 此页面如何检测桌面浏览器窗口的移动?
- python - 使用@font face 时在 QtWebEngine 中忽略 Google 字体 (ttf)
- python-3.x - HTTPError:服务暂时不可用(维基百科数据转储的多线程下载)
- ruby-on-rails - 使用服务器端功能将自定义字段添加到用户模型,同时利用设计进行初始身份验证
- sql-server - Visual Studio:使用网格视图更新 2 个表
- django - django - 测量中间件中的延迟
- angular - Angular 表单提交应被禁用,但单击时仍显示错误
- docker - 如何在 docker-compose .env 文件中包含特殊字符(例如'=')作为变量值的一部分?
- flask - 使用 Flask 和 axios 创建这个 Stripe 费用我做错了什么?
- c - while循环中的两个条件是什么?