Форма булевого поля DJANGO не сохраняется

У меня есть простой контрольный список, который водитель в воображаемом сценарии должен отметить перед началом своего дня. Для этого у меня есть модель, в которой есть все галочки:

from django.db import models
from accounts.models import User
from Inventory.models import trucks


class CheckList(models.Model):
    vehicle = models.ForeignKey(trucks, primary_key=True, on_delete=models.CASCADE)
    driver = models.ForeignKey(User, on_delete=models.CASCADE)
    breaks = models.BooleanField(null=False)
    wipers = models.BooleanField(null=False)
    cargo = models.BooleanField(null=False)  # If the cargo checks false its not a fatal failure but should return a warning to the previous driver saying he didn't do his task successful and warning should be issued from the office
    tires = models.BooleanField(null=False)
    oil = models.BooleanField(null=False)
    gas = models.BooleanField(null=False)
    seatbelt = models.BooleanField(null=False)
    date_created = models.DateTimeField(auto_created=True)

    def __str__(self):
        return self.vehicle.nickname

После модели я создал эту форму:

from django import forms
from .models import CheckList


class driver_form(forms.ModelForm):
    breaks = forms.BooleanField(widget=forms.CheckboxInput, required=False)
    wipers = forms.BooleanField(widget=forms.CheckboxInput, required=False)
    cargo = forms.BooleanField(widget=forms.CheckboxInput, required=False)
    tires = forms.BooleanField(widget=forms.CheckboxInput, required=False)
    oil = forms.BooleanField(widget=forms.CheckboxInput, required=False)
    gas = forms.BooleanField(widget=forms.CheckboxInput, required=False)
    seatbelt = forms.BooleanField(widget=forms.CheckboxInput, required=False)

    class Meta:
        model = CheckList
        fields = "__all__"
        exclude = ['driver', 'date_created', 'vehicle']

И наконец я добавил этот вид:

def driver_checkout(request, pk):
    items = trucks.objects.all()
    truck = trucks.objects.filter(pk=pk)
    form = driver_form()
    context = {
        'items': items,
        'truck_info': truck,
        'form': form,
    }

    if request.method == "POST":
        if form.is_valid():
            checklist = CheckList(
                vehicle=request.POST['vehicle'],
                driver=request.user,
                breaks=request.POST['breaks'],
                wipers=request.POST['wipers'],
                cargo=request.POST['cargo'],
                tires=request.POST['tires'],
                oil=request.POST['oil'],
                gas=request.POST['gas'],
                seatbelt=request.POST['seatbelt'],
                date_created=datetime.datetime.now(),
            )
            checklist.save()
            return render(request, 'driver/driver_home.html', context)
        else:
            return render(request, 'driver/checkout.html', context)

    else:
        return render(request, 'driver/checkout.html', context)

Теперь моя проблема в том, что все работает отлично, пока я не нажимаю кнопку сохранения в моем HTML, где я отображаю форму, она не проходит валидацию и отображается снова, что означает, что данные не попадают в БД. Я не могу понять, что я делаю не так, я использовал довольно похожий код раньше и он работал нормально в другом проекте. Я предполагаю, что, возможно, я неправильно реализую булевы поля?

А ModelForm также может сохранить данные и, вероятно, будет менее подвержен ошибкам, вы можете работать с:

from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
from django.utils import timezone

# …

@login_required
def driver_checkout(request, pk):
    # …
    if request.method == 'POST':
        form = driver_form(request.POST)
        if form.is_valid():
            form.instance.driver = request.user
            form.instance.vehicle_id = pk
            form.instance.date_created = timezone.now()
            checklist = form.save()
            return redirect('name-of-some-view')
        else:
            return render(request, 'driver/checkout.html', context)
    # …

Примечание: В случае успешного POST запроса, вы должны сделать redirect. [Django-doc] для реализации паттерна Post/Redirect/Get [wiki]. Это позволяет избежать повторения POST-запроса, когда пользователь обновляет браузер. браузер.


Примечание: Вы можете ограничить представления для аутентифицированных пользователей с помощью декоратора @login_required декоратора [Django-doc].

Вернуться на верх