Django как сохранить данные из чекбокса в базу данных

Я хочу добавить данные из чекбокса в базу данных. Посмотрел несколько видео, но ничего не получилось.

checkbox.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Checkbox</title>
</head>
<body>
<form action="" method="post">
{%csrf_token%}
    <div class="form-check">

        <h5>Checkbox_report</h5>
        <input type="checkbox" value="Executive_summary" id="Executive_summary" name="checkbox_data">
        <label for="Executive_summary"> Executive summary &nbsp</label>
        <input type="checkbox" value="Scope" id="Scope" name="checkbox_data">
        <label for="Scope"> Scope &nbsp</label>
        <input type="checkbox" value="ISMS" id="ISMS" name="checkbox_data">
        <label for="ISMS"> ISMS &nbsp</label>
        <input type="checkbox" value="Methodology" id="Methodology" name="checkbox_data">
        <label for="Methodology"> Methodology &nbsp</label>
        <input type="checkbox" value="Recommendation" id="Recommendation" name="checkbox_data">
        <label for="Recommendation"> Recommendation &nbsp</label>

    </div>
 <button type="submit">submit</button>
</form>
</body>
</html>

views.py

from collections import Counter
from django.shortcuts import render
# Create your views here.
def home(request):
    return render(request, 'home.html', {"text": "hello home"})
def about(request):
    return render(request, 'about.html', {"text": "hello about"})

def checkbox(request):
    if request.method == 'POST':
        checkbox_data = request.POST.getlist('checkbox_data')
        for i in checkbox_data:
            print(i)
    return render(request, 'checkbox.html')

Я хочу добавить 1 когда пользователь отмечает любой из чекбоксов, а те, которые не отмечены, добавить 0

второе:: что такое forms.py? в чем основная разница между forms.py и manage.py

Сначала прямое решение вашего вопроса, в сыром формате. Следуя этому ответу:

checkbox.html

<form action="" method="post">
{%csrf_token%}
    <div class="form-check">
        <h5>Checkbox_report</h5>
        <input type="hidden" name="Executive_summary" value="0" />
        <input type="checkbox" name="Executive_summary" value="1" id="Executive_summary" />
        <label for="Executive_summary"> Executive summary &nbsp</label>

        <input type="hidden" name="Scope" value="0" />
        <input type="checkbox" name="Scope" value="1" id="Scope" />
        <label for="Scope"> Scope &nbsp</label>

        <input type="hidden" name="ISMS" value="0" />
        <input type="checkbox" name="ISMS" value="1" id="ISMS" />
        <label for="ISMS"> ISMS &nbsp</label>

        <input type="hidden" name="Methodology" value="0" />
        <input type="checkbox" name="Methodology" value="1" id="ISMS" />
        <label for="Methodology"> Methodology &nbsp</label>

        <input type="hidden" name="Recommendation" value="0" />
        <input type="checkbox" name="Recommendation" value="1" id="Recommendation" />
        <label for="Recommendation"> Recommendation &nbsp</label>
    </div>
 <button type="submit">submit</button>
</form>

views.py:

def checkbox(request):
    if request.method == 'POST':
        exec_summary = request.POST.get('Executive_summary')
        scope = request.POST.get('Scope')
        isms = request.POST.get('ISMS')
        methodology = request.POST.get('Methodology')
        recommendation = request.POST.get('Recommendation')
        print(f'{exec_summary}{scope}{isms}{methodology}{recommendation}')

    return render(request, 'checkbox.html')

# Print Output Sample (0s and 1s):
10100

Теперь, чтобы ответить на ваш второй вопрос и привести еще один пример:

Модели - это карты таблиц базы данных (обычно одна модель связана с одной таблицей), с моделями Django предоставляет вам автоматически создаваемый API доступа к базе данных (другими словами, объектно-реляционное отображение или ORM).

С другой стороны, Формы используются для обработки ввода данных от ваших посетителей/пользователей. Django forms предлагает вам множество возможностей, которые дают вам такие преимущества, как более простой способ валидации и гораздо более чистый код. (Конечно, есть и компромиссы)

Итак, можно утверждать, что основное различие между ними заключается в том, что один из них напрямую связан с базой данных, а другой - нет.

В качестве примера преобразуем этот код в форму Django:

forms.py: (булевы поля автоматически отображаются как флажки)

from django import forms

class CheckBoxForm(forms.Form):
    exec_summary = forms.BooleanField(required=False)
    scope = forms.BooleanField(required=False)
    isms = forms.BooleanField(required=False)
    methodology = forms.BooleanField(required=False)
    recommendation = forms.BooleanField(required=False)

form_checkbox.html:

<body>
    <form action="" method="post">
        {%csrf_token%}
        {{form.as_p}}
        <button type="submit">submit</button>
    </form>
</body>

views.py:

from .forms import CheckBoxForm

def form_checkbox(request):
    if request.method == 'POST':
        form = CheckBoxForm(request.POST or None)

        if form.is_valid():
            print(form.cleaned_data)
    else:
        form = CheckBoxForm()

    context = {'form': form}
    return render(request, 'form_checkbox.html', context)

# Print Output Sample
{'exec_summary': True, 'scope': False, 'isms': True, 'methodology': False, 'recommendation': False}
Вернуться на верх