Форма булевого поля 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].