首页 > 解决方案 > (仍然未回答)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.py 在此处输入图像描述

即使我从我的 html 插入记录也未选中(否),结果总是在我的数据库中自动“是”,你能修复我的 javascript 代码吗?似乎它不起作用。

在此处输入图像描述

标签: javascriptdjango

解决方案


引用自此来源的文本: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')


推荐阅读