(仍然未回答)Django复选框在数据库中保存是或否

时间:2019-11-13 02:50:36

标签: 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中的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.py enter image description here

即使我从我的html中插入记录也是未选中的(否),结果在我的数据库中始终自动为“是”,您能解决我的javascript代码吗?似乎不起作用。

enter image description here

4 个答案:

答案 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', {})

完整项目

Download here

编辑(使用<!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">