首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(仍然是unAnswered) django复选框在数据库中保存是或否

(仍然是unAnswered) django复选框在数据库中保存是或否
EN

Stack Overflow用户
提问于 2019-11-13 02:50:36
回答 4查看 1.2K关注 0票数 7
代码语言:javascript
复制
  <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中有这个代码

代码语言:javascript
复制
<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中的复选框(NO)。我不知道我的javascript做得对不对

这是我的views.py

代码语言:javascript
复制
    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

代码语言:javascript
复制
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代码好吗?好像不起作用。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-11-21 06:17:30

删除所有javascript。这是将所有的0转换为1。

代码语言:javascript
复制
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'

而不是这样:

代码语言:javascript
复制
Asthma = request.POST['Asthma']
Congenital = request.POST['Congenital']
Contact = request.POST['Contact']

-------------Edit------------------

视图

代码语言:javascript
复制
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()

模板

代码语言:javascript
复制
<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">
票数 0
EN

Stack Overflow用户

发布于 2019-11-21 21:41:16

摘自本资料来源:类型

同样的问题不仅适用于Joomla项目,也适用于其他使用复选框的web应用程序或网站(特别是粗体部分)。

需要特别注意保存表单中的未选中复选框!!对于组件开发人员来说,这是一个常见的错误,因为他们认为Joomla会处理这个问题。乔姆拉直到现在才知道。( Joomla 2.5仍有问题。) 您可以看到,在保存带有未选中复选框的表单时,POST数据中没有它的变量!因此,很常见的情况是,该值不会被覆盖在您的DB中,特别是如果它已经在表单上表示“选中”(例如1)的值上。

这就是你问题中的JavaScript片段的作用所在。

代码语言: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请求数据之外。当您自己选中项时,它将保留它们,并且它将表示为复选框(Es)的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')

票数 2
EN

Stack Overflow用户

发布于 2019-11-13 03:19:14

解决方案

删除Javascript代码。你不需要它。

更多细节

对于这个问题,您并不需要真正理解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和函数每一个 (用于循环元素)和属性函数(用于修改HTML元素的属性)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58829631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档