<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中的checkbox(NO)。 我不知道我在用JavaScript做的事是否正确
这是我的views.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()
models.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代码吗?似乎不起作用。
答案 0 :(得分:2)
引自以下来源的引文: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']}>
这表示例如request.POST['Asthma']
将始终返回列表,该列表可能被转换为布尔类型。因此,无论列表中有什么内容,它都可能始终强制转换为True
。
所以当您阅读它时,会说:
QueryDict.__getitem__(key)¶
返回给定键的值。如果 该键具有多个值,它返回最后一个值。
因此,最好在此处使用__getitem__(key)
或其别名:
QueryDict.get(key, default=None)¶
使用与以下相同的逻辑 getitem (),带有一个钩子,用于在键不存在时返回默认值。
当然,使用JavaScript代码段是可以使用的一种方法。但是,如果您希望在Python代码中处理此问题,则可以像这样使用QueryDict
:
Asthma = request.POST.get('Asthma', '0')
答案 1 :(得分:1)
删除该Javascript代码。您不需要它。
您实际上不需要了解Javascript即可解决此问题。这些评论告诉您正在发生的事情,但我会尽力澄清:
// when page is ready
$(document).ready(function() {
// on form submit -> This means that this code will run when the form is submitted
$("#form").on('submit', function() {
// to each unchecked checkbox -> This means that each checkbox not checked, will run this code below
$(this + 'input[type=checkbox]:not(:checked)').each(function () {
// set value 0 and check it -> This means that
$(this).attr('checked', true).val(0);
});
})
})
如果您想了解更多信息,此代码将jQuery与函数each(用于循环遍历元素)和attr函数(用于修改HTML)结合使用元素的属性)。
答案 2 :(得分:0)
您不需要javascript。还要忘掉表单中的method="POST"
(默认方法是GET
)。
此外,对于您的views.py
,您需要使用get
的{{1}}方法来防止request.POST
异常。
models.py
KeyError
views.py
from django.db import models
class StudentUserMedicalRecord(models.Model):
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)
index.html
from django.shortcuts import render
from .models import StudentUserMedicalRecord
def sample_view(request):
if request.method == 'POST':
Asthma = request.POST.get('Asthma', '0')
Congenital = request.POST.get('Congenital', '0')
Contact = request.POST.get('Contact', '0')
instance = StudentUserMedicalRecord(
Asthma=Asthma,
CongenitalAnomalies=Congenital,
ContactLenses=Contact
)
instance.save()
return render(request, 'index.html', {})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Project</title>
</head>
<body>
<form id="form" name="form" method="POST"> {% csrf_token %}
<label>Asthma</label>
<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">
<br>
<label>Congenital Anomalies</label>
<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">
<br>
<label>Contact lens</label>
<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">
<br>
<input type="submit" value="Save">
</form>
</body>
</html>
)您可以使用django的ModelForms
来手动制作表格来防止此类问题。
因此,在这种情况下,您将:
forms.py-在views.py旁边
ModelForm
views.py
from django import forms
from .models import StudentUserMedicalRecord
class MedicalRecordForm(forms.ModelForm):
class Meta:
model = StudentUserMedicalRecord
fields = '__all__'
index.html
from django.shortcuts import render
from sample_app.forms import MedicalRecordForm
def sample_view(request):
if request.method == 'POST':
form = MedicalRecordForm(request.POST)
if form.is_valid():
form.save()
else:
form = MedicalRecordForm()
return render(request, 'index.html', {'form': form})
在the docs中找到有关它们的更多信息。
答案 3 :(得分:0)
删除所有JavaScript。那就是将所有0转换为1。在 views.py
中使用它Asthma = request.POST.get('Asthma', 0) # 0 not '0'
Congenital = request.POST.get('Congenital', 0) # 0 not '0'
Contact = request.POST.get('Contact', 0) # 0 not '0'
代替此:
Asthma = request.POST['Asthma']
Congenital = request.POST['Congenital']
Contact = request.POST['Contact']
-------------编辑------------------
观看次数
Asthma = request.POST.get('Asthma', 0) == '1'
Congenital = request.POST.get('Congenital', 0) == '1'
Contact = request.POST.get('Contact', 0) == '1'
V_insert_data = StudentUserMedicalRecord(
Asthma=Asthma,
CongenitalAnomalies=Congenital,
ContactLenses=Contact
)
V_insert_data.save()
模板
<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="checkbox2" 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="checkbox3" title="Check if Student use Contact lens">